Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#76 01-08-2016 14:25:57

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Peut - on battre le hasard ?

leon1789 a écrit :
yoshi a écrit :

def cmp(x,y):
    return (y[0]>x[0] and y[1]>x[1]) or (y[0]>x[0] and y[2]>x[2]) or (y[1]>x[1] and y[2]>x[2])

tiens, histoire de faire le chieur de service : on veut qu'au moins deux y_i soient supérieurs à deux x_i, donc
return ( (y[0]>x[0]) + (y[1]>x[1]) + (y[2]>x[2]) > 1 )
doit faire le même travail, non ?

yoshi a écrit :

Cette fois j'ai réfléchi... Si, si, ça m'arrive.
Et j'ai aussi relu l'énoncé qui précise comment se fait la comparaison des triplets :

Un arbitre compare les trois suites de nombre comme suit : x1 à y1 , x2 à y2 et x3 à y3

Donc la fonction telle que je l'avais écrite est correcte !

Oui, ta fonction cmp est correcte, pas de souci.

Mais la mienne aussi je pense : le code
return ( (y[0]>x[0]) + (y[1]>x[1]) + (y[2]>x[2]) > 1 )
ne compare qu'une seule fois les coordonnées respectives (astuce permise par le langage).

Hors ligne

#77 01-08-2016 14:43:32

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Peut - on battre le hasard ?

Re,

Mais la mienne aussi je pense : le code
return ( (y[0]>x[0]) + (y[1]>x[1]) + (y[2]>x[2]) > 1 )

Tout à fait, c'est dans le même esprit que mon return...
Ta fonction va retourner 0, 1, 2 ou 3 et il y aura succès pour résultat >=2.
J'ai voulu utiliser la fonction zip() que je n'avais encore pas eu l'occasion de tester...

Pour les néophytes, précision :
a>b ne renvoie que 2 états : True ou False (Vrai ou Faux)
Mais il se trouve qu'en Python et dans d'autres langages aussi : True c'est aussi 1 (-1 dans le Basic de mes débuts) et False 0...
Donc le return de leon (et le mien puisque zip() fait ces mêmes comparaisons) ne peuvent renvoyer que 4 états possibles :
False 3 fois : 0+0+0 = 0
True 3 fois : 1+1+1 = 3

Mais aussi
1 fois True :
1+0+0 ; 0+1+0 ou 0+0+1 qui donne 1

2 fois True  :
1+1+0 ; 1+0+1 ; 0+1+1  qui donne 2

Ce qui évite les and et les or qui sont sous-jacents...

@+

Hors ligne

#78 01-08-2016 16:09:32

Yassine
Membre
Inscription : 09-04-2013
Messages : 1 090

Re : Peut - on battre le hasard ?

@yoshi,
Je fais aussi mon "tetra capillo secator"(*) : la valeur 3 est impossible

L'astuce est en effet pas mal car elle réduit le nombre de comparaisons. Avec mon code, on peut être amené à faire jusqu'à 6 comparaisons.

Pour rendre le code plus lisible, je propose l'écriture suivante  ):


def is_lower(a,b)
 return sum([1 if a[i] < b[i] else 0 for i in range(3)]) > 1
 

(*) : coupeur de cheveu en quatre. Sachant que la construction est un peu bancale, elle mélange latin et grecs, mais vues mes origines, je peux me permettre sans scrupules !

Hors ligne

#79 01-08-2016 16:38:57

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Peut - on battre le hasard ?

Bonjour,

J'ai essayé de traduire en Python le code de Dlz (post #30)...
Ça tourne
j'obtiens des résultats aberrants
Si je teste son nombre de succès j'en trouve 16 (S) avec sa comparaison 3866 (Sm) avec la mienne et je parle même pas de la moyenne...
Voilà ce que je fais :

from random import randint

def cmp(x,y):
    return sum([1*(y>x) for x,y in zip(x,y)])


n=0
H_gagneY,S=0,0
Sm=0
Tirages_M,Tirages_H=[],[]
for k in range(100):
    for j in range(100):
        n+=1
        H_gagne=0
        x1=randint(1,2016)  
        r = 2016-x1
        r=max(r,2)
        x2=randint(1,r)
        x3=2016-x1-x2
        if x1>x2:
            x,x2=x2,x1
            x1=x
        if x1>x3:
            x,x3=x3,x1
            x1=x
        if x1>x3:
            x,x3=x3,x2
            x2=x
        y1,y2,y3=j,0,0
        if j%2==1:
            y2,y3=1008-y1//2-1,1008-y1//2
        else:
            y2,y3=1008-y1//2,1008-y1//2
        a,b=(x1,x2,x3),(y1,y2,y3)
        Tirages_M.append(a)
        Tirages_H.append(b)
        #print (a,"  ",b)
        Sm+=(cmp(a,b)>=2)
        if y2>x2 and y3>x3:
            H_gagne+=1
            #if res<2:
                #print ("Faux",n)
    S+=H_gagne

Moyenne=S/n
print("\n--->  Moyenne :",Moyenne)

Il y aussi des triplets commençant par 0,
Les composants des triplets sont créés puis triés ensuite...
Très mal foutu...

Je dois m'absenter, je repasserai...

@+

Hors ligne

#80 01-08-2016 20:20:35

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Peut - on battre le hasard ?

Re,

Je crois avoir compris son truc et réglé le pb des 0.


from random import randint

def cmp(x,y):
    return sum([1*(y>x) for x,y in zip(x,y)])

Tirages_M,Tirages_H=[],[]
for k in range(100):
    Sm=0
    for j in range(1,101):
        x1=randint(1,2014)  
        r = 2016-x1
        r=max(r,2)
        x2=randint(1,r)
        x3=2016-x1-x2
        Lm=[x1,x2,x3]
        Lm.sort()
        x1,x2,x3=Lm
        y1,y2=j,(2016-j)//2+(j%2==0)
        y3=2016-y1-y2
        Lh=[y1,y2,y3]
        Lh.sort()
        y1,y2,y3=Lh
        a,b=(x1,x2,x3),(y1,y2,y3)
        Tirages_M.append(a)
        Tirages_H.append(b)
        Sm+=(cmp(a,b)>1)
    S+=Sm

Moyenne=S/100
print("\n--->  Moyenne :",Moyenne)
 

La méthode .sort() trie "sur place".
Je crée x1,x2,x3 je les stocke dans une liste, je trie, et je récupère x1,x2,x3 triés par ordre croissant.
Idem pour y1,y2,y3
A tout hasard, je stocke les triplets machines et les triplets humains ainsi créés, séparément (c'est la méthode de liste .append() qui "ajoute" un triplet après l'autre) :. Je ne m'en sers pas, c'est pour toutes vérifications ultérieures éventuelles...
20 lancements de ce script :
--->  Moyenne : 37.52
--->  Moyenne : 36.52
--->  Moyenne : 37.26
--->  Moyenne : 38.45
--->  Moyenne : 36.36
--->  Moyenne : 37.48
--->  Moyenne : 36.57
--->  Moyenne : 37.97
--->  Moyenne : 37.74
--->  Moyenne : 37.5
--->  Moyenne : 38.33
--->  Moyenne : 37.67
--->  Moyenne : 37.35
--->  Moyenne : 38.28
--->  Moyenne : 37.18
--->  Moyenne : 37.63
--->  Moyenne : 37.43
--->  Moyenne : 37.21
--->  Moyenne : 36.75
--->  Moyenne : 38.0

Je ne saisis pas les 85 % annoncés...

@+

[EDIT]Ma fonction cmp(x,y) ne fait que 3 comparaisons conformément au cahier des charges... Mais j'ai remplacé >=2 par >1 ce qui revient au même, mais supprime une comparaison.

Dernière modification par yoshi (01-08-2016 20:52:54)

Hors ligne

#81 01-08-2016 20:52:58

Yassine
Membre
Inscription : 09-04-2013
Messages : 1 090

Re : Peut - on battre le hasard ?

Je poste ci-dessous le code Python du programme qui calcule la liste des 100 meilleurs triplets.
Le programme met 16 mn à tourner sur ma machine. Il n'est probablement pas très optimisé.

from threading import Thread, RLock
import time
import sys
import datetime
import math
import csv

SumNumber = 2016
#SumNumber = 60


def out_csv(l, fname):
  with open(fname, 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=';')
    for e in l:
      writer.writerow(e)

def get_triples():
  return [(i,j,SumNumber-i-j) for i in range(1, SumNumber//3 + 1) for j in range (i, (SumNumber-i)//2+1)]

def case1(a,b,c):
  if b-a < 3:
    return 0
  n = 0
  for d_a in range(2,b-a):
    b_inf = math.ceil(max(1,0.5*(d_a - (c-b))))
    b_sup = math.floor(min(d_a-1,(b-a)-d_a))
    if b_inf <= b_sup:
      n += (b_sup-b_inf+1)
  return n
 
def case2(a,b,c):
  if a < 2:
    return 0
  n = 0
  for d_a in range(1,a):
    b_inf = d_a + 1
    b_sup = math.floor(0.5*(c-b+d_a))
    if b_inf <= b_sup:
      n += (b_sup-b_inf+1)
  return n

def case3(a,b,c):
  n = 0
  c_sup = min(SumNumber-2-c,b+a-2)
  for d_c in range(1,c_sup+1):
    a_inf = math.ceil(max(1,0.5*(d_c-(b-a))))
    a_sup = min(d_c-1,a-1)
    if a_inf <= a_sup:
      n += (a_sup-a_inf+1)
  return n

def count_lowers(x):
  k1 = case1(x[0],x[1],x[2])
  k2 = case2(x[0],x[1],x[2])
  k3 = case3(x[0],x[1],x[2])
  return k1+k2+k3

 
def cmp_triple(a,b):
  return sum([1 if a[i] > b[i] else 0 for i in range(3)]) > 1

class Worker(Thread):
  def __init__(self, population, start_index, count, store,verrou):
    Thread.__init__(self)
    self.population = population
    self.start_index = start_index
    self.count = count
    self.store = store
    self.verrou = verrou

  def run(self):
    chunk_size = 0
    r = []
    for i in range(self.start_index, self.start_index + self.count):
      r.append([self.population[i][0],self.population[i][1],self.population[i][2], count_lowers(self.population[i])])
      chunk_size += 1
      if chunk_size == 100:
        with verrou:
          for x in r:
            self.store.append(x)
        chunk_size = 0
        r = []
    if r != []:
      with verrou:
        for x in r:
          self.store.append(x)

nombre_de_threads = 5

population = get_triples()
threads = []
store = []
verrou = RLock()
count_total = len(population)
count = int(count_total/nombre_de_threads)
for i in range(nombre_de_threads):
  start_index = int(i*count)
  if i == nombre_de_threads-1:
    th_count = int(count_total - (nombre_de_threads-1)*count)
  else:
    th_count = count
  threads.append(Worker(population, start_index, th_count, store, verrou))


 
start_time = time.clock()

for i in range(nombre_de_threads):
  threads[i].start()

Finished = False
while not Finished:
  time.sleep(2)
  with verrou:
    Completed = len(store)
  if Completed == count_total:
    Finished=True
  else:
    duration = time.clock()
    estimated_remaining = (count_total-Completed)*duration/Completed
    duree = str(datetime.timedelta(seconds=duration))
    duree_restante = str(datetime.timedelta(seconds=estimated_remaining))
    print('\rCompleted : {0}/{1}, Temps passé : {2}, temps restant estimé : {3}'.format(Completed, count_total, duree, duree_restante), end="")

store.sort(key=lambda x: x[3], reverse=True)
out_csv(store[:100], 'resultats_triplets.csv')
#out_csv(store, 'resultats_triplets.csv')

 

Hors ligne

#82 01-08-2016 20:58:26

Yassine
Membre
Inscription : 09-04-2013
Messages : 1 090

Re : Peut - on battre le hasard ?

Un point me semble assez intriguant, les 18 premiers triplets ont tous leurs deux dernière composantes égales.
Je me demande si c'est une coïncidence due au nombre 2016 ou bien si, quelque que soit cette somme, le maximum sera toujours atteint lorsque cette condition est vérifiée.
A ce stade de ma compréhension de cette relation de pseudo-ordre, la réponse à cette question me semble inatteignable.

Hors ligne

#83 02-08-2016 10:07:48

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

Bonjour Yoshi

Yoshi a écrit :

Je n'aime pas le C, je n'aime pas l'écriture programmatique de notre ami.

C'est ton droit le plus strict.
Voici un avis,  concernant le Python, de quelqu'un qui sait de quoi il parle.

Je suis allergique au python. Je trouve le code spécialement illisible et un-maintenable. C'est un langage qui ne présente que des inconvénients par rapports aux autres langages. J'ai l'impression qu'ils ont pris le pire de tous. Et pourtant c'est un des langages les plus utilisés actuellement... c'est à n'y rien comprendre.

Bonne journée.

Hors ligne

#84 02-08-2016 10:22:13

tibo
Membre expert
Inscription : 23-01-2008
Messages : 1 097

Re : Peut - on battre le hasard ?

Salut,

Je suis intéressé de savoir qui est ce "quelqu'un qui sait de quoi il parle".
Tous les langages ont leurs avantages, leurs défauts et leur propre domaine de programmation. (on ne va pas coder du tout la même chose en assembleur, en C, en java et en Unity)
De plus, chaque développeur a ses petites habitudes dans son langage de prédilection.

Mais de là à dire que Python est "spécialement illisible", "ne présente que des inconvénients" et est "le pire de tous", c'est un peu fort.
Ça ressemble beaucoup a un troll quand même.

Hors ligne

#85 02-08-2016 10:51:08

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Peut - on battre le hasard ?

Re,

Voici un avis,  concernant le Python, de quelqu'un qui sait de quoi il parle.

Qui ?
En quoi sait-il de quoi il parle ? Encore une affirmation péremptoire et gratuite en l'état (invérifiable)...

Je trouve le code spécialement illisible et un-maintenable

Il a le droit de le penser, mais c'est faux pour les deux affirmations...
Illisible ? C'est risible !
Je connais pas mal de Basics, je fais un peu de C, de C++, j'ai vu du Ruby, du Haskell, j'ai tâté du Pascal.
Python est celui qui a la syntaxe la plus lisible.
Ce qui perturbe beaucoup de monde, c'est le typage dynamique : même si c'est un peu regrettable, on s'y fait très bien !
Par exemple, dans la reproduction de ton code en Python dis-moi ce qui te gène...
Le Pascal (ou Delphi) était assez clair.
Python est un langage POO. Et le C ? Peut-on y arriver  sans "acrobaties" ?
Yassine fait de la POO sur son dernier script.

Pourquoi donc, si Python était un langage aussi merdique,sont-ils mâtinés de Python ?
Soyons constructifs... Veux-tu qu'en section Programmation, nous ouvrions une discussion pour voir ça de plus près ?
Tu écris un script calculant l'indicatrice d'Euler, je te propose ma version Python.
Et on s'explique...
Je ne cherche pas à te convaincre de la supériorité de Python, chacun ses goûts, mais je voudrais faire sauter tes préventions basées sur des on-dit et te prouver que non, ce n'est pas illisible, non le code n'es pas in-maintenable...
Il faut comme dans tout langage, structurer sa pensée, son code et penser justement à la maintenance ultérieure...
Un code écrit avec les pieds sera, qqst le langage, illisible et in-maintenable : c'était le cas de mes premiers codes en Basic Locomotive celui de l'Amstrad CPC 6128.
Quand je les relis, je me dis : Mon dieu ! Ce n'est pas possible... C'est écrit n'importe comment, ça gigote dans tous les sens !

@+

Dernière modification par yoshi (02-08-2016 13:14:43)

Hors ligne

#86 02-08-2016 10:56:36

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

Bonjour Tibo,
Je te dirai qui est l'auteur de cette remarque si tu me dis qui tu es, tes rapports avec l'informatique, ton expérience, ce qui te permet de répondre avec l'assurance de celui qui sait vis à vis de quelqu'un qui se contente de donner un avis personnel.
Il ne s'agit en aucun cas d'un troll. Cette remarque, reçue par mail ce matin m'a donnée l'occasion de répondre à certains qui ne cherchent qu'à envenimer les échanges.
Bonne journée.

Hors ligne

#87 02-08-2016 10:59:57

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Peut - on battre le hasard ?

Salut,

Il ne s'agit en aucun cas d'un troll. Cette remarque, reçue par mail ce matin m'a donnée l'occasion de répondre à certains qui ne cherchent qu'à envenimer les échanges.

Pas moi, ni avec casquette modo, ni sans. Si je le faisais, au pire tu te demanderais si... au mieux, tu ne t'en apercevrais pas...
Pas leon, ton vieil "ennemi", je le crois au dessus de ça...
Pas tibo, pas son style,
Pas Yassine, je pense qu'il a suffisamment montré de quoi il était capable en Maths et en Python.
Freddy ? Bah, il est "rugueux", mais c'est son humour à,lui... Mais il t'es arrivé de l'exaspérer au plus haut point...
Alors qui ? qui cherche à envenimer les échanges ?  Et t'as intérêt à justifier ta réponse...
V'la un troll qui promet...
A qui as-tu répondu ? Et comment ? Parce que moi, je ne la vois pas cette fameuse réponse (sous entendu cinglante et définitive...).

@+

Dernière modification par yoshi (02-08-2016 11:53:42)

Hors ligne

#88 02-08-2016 13:23:01

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

/*
Voilà ma nouvelle version.
Dans un premier temps, j'ai évalué ce que j'appelle le "triplet X gagnant". Il vaut à peu près 190 + 484 + 1340.  (simple simulation).
Le "triplet X moyen" est naturellement 672 + 672 + 672.
La valeur x1 la moins gagnante, c'est à dire la plus favorable à Y est 672 - 190 = 482.
Pour Y il est clair que les valeurs y2 et y3 les plus favorables sont les plus proches,
c'est à dire contrairement à x2 et x3 très différentes.
Par soustraction on en déduit le triplet le plus favorable à Y = 482 + 767 + 767.
*/

int main()   // suivant 195
{
  randomize();
  int TgagneX=0;   // la machine
  int TgagneY=0;   // l'homme
  int y01=482;
  int y02=767;
  int y03=767;
  bool Faute=false;
  for (int fois=0; fois < 100 && !Faute; fois++)
  {
    int gagneX=0;
    int gagneY=0;
    int cas=1;
    struct TRIPLET
    {
      int y1;
      int y2;
      int y3;
    } Triplet[100];
    for (int jeu=0; jeu<100; jeu++, cas++)
    {
      int x1=rand()%2016 +1;  // de 1 à 2016
      int r=2016-x1;
      r=max(r,2);
      int x2=rand()%r + 1;
      int x3=2016 - x1 - x2;
      if (x1>x2) { int x=x2; x2=x1; x1=x; }
      if (x1>x3) { int x=x3; x3=x1; x1=x; }
      if (x2>x3) { int x=x3; x3=x2; x2=x; }
// méthode Dlzlogic basée sur le complément à la moyenne des X gagnant
// le troplet de départ est 482 767 767
/* à partir de celui-là,
1- on diminue y1 de 1
2- on augmente de 1 y2
3- on augmente de 1 y3
4- on diminue encore y1
5- on augmente de 1 y2 et y3
6 à 10 la même chose dans l'autre sens
*/
      int y1, y2, y3;
      cas = jeu/6+1;
      switch (jeu%6+1)
      {
        case 1:
        y1=y01-cas; y2=y02+cas; y3=y03; break;
        case 2:
        y1=y01-cas; y2=y02; y3=y03+cas; break;
        case 3:
        y1=y01-cas*2; y2=y02+cas; y3=y03+cas; break;
        case 4:
        y1=y01+cas; y3=y02-cas; y2=y03; break;     // y3 >= y2
        case 5:
        y1=y01+cas; y3=y02; y2=y03-cas; break;
        case 6:
        y1=y01+cas*2; y3=y02-cas; y2=y03-cas; break;
      }
// Vérif pour sécurité
      if (y1+y2+y3 != 2016)
      {
        fprintf(espion,"FAUTE jeu= %d  y1=%d  y2=%d  y3=%d \n",jeu,y1,y2,y3);
        Faute=true;
        break;
      }
      Triplet[jeu].y1=y1;
      Triplet[jeu].y2=y2;
      Triplet[jeu].y3=y3;
      if (y2 > x2 && y3 > x3 || y1 > x1 && y3 > x3 || y1 > x1 && y2 > x2  ) gagneY++;
      else if (y2 < x2 && y3 < x3 || y1 < x1 && y3 < x3 || y1 < x1 && y2 < x2  ) gagneX++;
      else { jeu--; cas--;}
    }
// vérification que le triplet est unique.
    for (int i=0; i<99; i++)
    {
      int y1, y2, y3;
      y1=Triplet[i].y1;
      y2=Triplet[i].y2;
      y3=Triplet[i].y3;
      for (int j=i+1; j<100; j++)
      {
        if (y1 == Triplet[j].y1 && y2 == Triplet[j].y2 && y3 == Triplet[j].y3 )
        {
          fprintf(espion,"FAUTE i= %d j= %d  y1=%d  y2=%d  y3=%d Triplet déjà vu\n",i,j,y1,y2,y3);
          Faute=true;
          break;
        }
      }
    }
    TgagneX+=gagneX;
    TgagneY+=gagneY;
  }
  fprintf(espion,"Méthode Dlzlogic TgagneX = %d  TgagneY = %d\n",TgagneX, TgagneY);
}
 

Hors ligne

#89 02-08-2016 14:22:44

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

Bon, Yoshi, je viens de lire ton message #85, il m'avait échappé.
Celui qui a écrit cet avis sur Python, c'est pas un secret, c'est mon fils. Il est vrai que comme moi, il s'est passionné pour l'informatique, mais lui il a fait des études dans ce sens. Sa spécialité est plutôt le domaine de la sécurité, mais il connait beaucoup de langages et je sais qu'il est compétent pour donner un avis personnel argumenté.     
Apparemment une discussion sur l'informatique semble te tenter, pourquoi pas, c'est un sujet que je connais un peu.

Hors ligne

#90 02-08-2016 14:57:23

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Peut - on battre le hasard ?

Salut,

Tant DevC++ que CodeBlocks refusent d'exécuter ton script : j'ai une palanquée d'erreurs.
A commencer par bool Faute=false;  --> error: unknown type name bool
Et je lis :

booléen : En C il n'existe pas de type spécial pour variables booléennes. Tous les types de variables numériques peuvent être utilisés pour exprimer des opérations logiques.
Si l'utilisation d'une variable booléenne est indispensable, le plus naturel sera d'utiliser une variable du type int.

Les opérations logiques en C retournent toujours des résultats du type int:

Je voulais seulement savoir ce que tu faisais avec la ligne :
for (int fois=0; fois < 100 && !Faute; fois++)
C'est une boucle de 0 à 100 qui ne s'exécute que si Faute est False ?
Et si Faute=True, tu sors de la boucle ?

C'est une boucle  qui s'exécute de 0 à 100 si Faute est False, de 0 à 101  si Faute est True ? question qui - en principe n'a pas de sens - mais je la pose par acquit de conscience.

Et aussi
for (int jeu=0; jeu<100; jeu++, cas++)
Boucle à pas variable de 1 à 6 ?

J'aurais pu éviter de demander si ton script avait bien voulu s'exécuter...

@+

[EDIT]
Je comprends que tu apprécies le jugement de ton fils.
Cela dit, qu'est-ce que tu sais des capacités de jugement d'autres personnes ?
http://www.developpez.net/forums/d13783 … essionnel/
http://www.developpez.net/forums/d29700 … ersus-cpp/

Hors ligne

#91 02-08-2016 15:02:31

tibo
Membre expert
Inscription : 23-01-2008
Messages : 1 097

Re : Peut - on battre le hasard ?

Re,

[hors-sujet]
En fait, il y a un truc qui m’embête dans les 'discussions' avec toi, c'est ton utilisation abusive de l'argument d'autorité :
"Untel Kissiconé, expert en [sujet de la discussion] a dit ça donc c'est vrai."
Du coup, son avis devient le tien et plus rien ne peut te faire changer d'avis, même quand on te met face à tes contradictions.
Et quand on te demande une démonstration mathématique pour un problème, tu es incapable de la donner, vu que tes idées ne sont que des trucs piochés à droite à gauche sans que tu les comprennes vraiment.

Et ça c'est quand tu cites quelqu'un. Parce qu'il arrive que tu balances des phrases sans vraiment de sens. Comme ce mail qu'un "envenimeur de discussion" t'aurait envoyé...

Pire encore, la réciproque de l'argument d'autorité : Quand tu me demande mon rapport à l'informatique, qui suis-je pour oser donner mon avis... Parce que je n'ai pas de doctorat en informatique, mon avis n'aurais aucune valeur...

En conséquence, une discussion sur les différents langage de programmation qui pourrait être très intéressante, devient un échange complètement stérile, où tu donneras l'avis d'autres personnes "expertes", le tout devenant un immense troll comme la plupart des discussions auxquelles tu participes.

Bref, je n'arrive pas à me décider entre continuer à alimenter tes trolls, ou bien me brider et cesser de participer à toute discussion où tu es présent.
Dans tous les cas ça ne me plait pas.
[\hors-sujet]

Dernière modification par tibo (02-08-2016 15:09:34)

Hors ligne

#92 02-08-2016 16:21:34

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Peut - on battre le hasard ?

bonjour

tibo a écrit :

Parce que je n'ai pas de doctorat en informatique, mon avis n'aurais aucune valeur...

...et même si tu (ou quelqu'un d'autre sur le forum) avais un doctorat en informatique, voire une habilitation à diriger des recherches, ou bien une agrégation en mathématiques, etc. cela ne ferait ni chaud ni froid à Dlzlogic.

Je préfère revenir au dernier code fourni :

Dlzlogic a écrit :

      int x1=rand()%2016 +1;  // de 1 à 2016
      int r=2016-x1;
      r=max(r,2);
      int x2=rand()%r + 1;
      int x3=2016 - x1 - x2;
      if (x1>x2) { int x=x2; x2=x1; x1=x; }
      if (x1>x3) { int x=x3; x3=x1; x1=x; }
      if (x2>x3) { int x=x3; x3=x2; x2=x; }
 

Cela ne respecte toujours pas les règles du jeu.

En effet, en première ligne x1 peut valoir 2016, puis r=0 , puis r=2, puis x2 = 1 ou 2 , puis x3 = -1 ou -2, et le triplet trié produit est (-1, 1, 2016) ou (-2, 2, 2016) !

Hors ligne

#93 02-08-2016 16:52:11

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Peut - on battre le hasard ?

Il me semble que le plus simple pour réaliser un tirage sur les triplets strictement positifs croissants de somme 2016 suivant la loi uniforme, c'est d’exécuter ces trois petites lignes (en pseudo-code) :

int x1 = rand(1 ... 2016/3)    
int x2 = rand(x1 ... (2016-x1)/2)          
int x3 = 2016-x1-x2              
// ici, 1 <= x1 <= x2 <= x3     et   x1+x2+x3=2016
 

où la fonction rand(a...b) renvoie un entier de l'ensemble {a,a+1,...,b} aléatoirement suivant la loi uniforme.

De cette manière, on produit l'un des 338688 triplets possibles, et il y a une seule façon pour chacun d'entre eux.

EDIT : Non, cette manière de faire ne suit pas la loi uniforme non plus : [1,1,2014] a 1007 fois moins de chance d'être obtenu que [672,672,672] .  Grrr

Dernière modification par leon1789 (02-08-2016 19:47:17)

Hors ligne

#94 02-08-2016 17:00:03

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

Je vais essayer de répondre.

Yoshi a écrit :

Tant DevC++ que CodeBlocks refusent d'exécuter ton script : j'ai une palanquée d'erreurs.
A commencer par bool Faute=false;  --> error: unknown type name bool
Et je lis :

    booléen : En C il n'existe pas de type spécial pour variables booléennes. Tous les types de variables numériques peuvent être utilisés pour exprimer des opérations logiques.
    Si l'utilisation d'une variable booléenne est indispensable, le plus naturel sera d'utiliser une variable du type int.

    Les opérations logiques en C retournent toujours des résultats du type int:

Il est vrai que le type bool n'existe pas en base. Mon compilateur l'a déclaré, voici :

Borland a écrit :

Description

bool et les littéraux false et true permettent d'effectuer une logique booléenne.

Le mot clé bool représente un type ne pouvant prendre que la valeur false ou true. Les mots clés false et true sont des littéraux booléens avec des valeurs prédéfinies. false est le nombre zéro et true est le nombre un. Ces littéraux booléens sont des rvalues ; vous ne pouvez pas leur donner une affectation.

Vous pouvez convertir une rvalue de type bool en rvalue de type int. La conversion numérique met false à zéro et true devient un.

Vous pouvez convertir des types arithmétiques, énumération, pointeur ou pointeur vers une rvalue membre, vers une rvalue de type bool
. Une valeur zéro, une valeur pointeur null ou une valeur de pointeur membre null est convertie en false. Toute autre valeur est convertie en true.

Son utilisation est très courante, mais il est vrai qu'en mémoire, c'est un int.

Yoshi a écrit :

Je voulais seulement savoir ce que tu faisais avec la ligne :
for (int fois=0; fois < 100 && !Faute; fois++)
C'est une boucle de 0 à 100 qui ne s'exécute que si Faute est False ?
Et si Faute=True, tu sors de la boucle ?

C'est une boucle  qui s'exécute de 0 à 100 si Faute est False, de 0 à 101  si Faute est True ? question qui - en principe n'a pas de sens - mais je la pose par acquit de conscience.

J'ai prévu 2 vérifications, et si la vérification n'était pas satisfaisante, j'avais un grand nombre de lignes disant la même chose.
En C, une boucle for contient 3 parties
1- initialisation ex. int fois = 0;
2- test ex. fois < 100 && !Faute; si fois est > ou = à 100 ou si Faute est vrai, elle s'arrête. Pour fois >= 100 ça correspond au comptage, le test de Faute, juste une précaution utile à la mise au point. 
3- l'incrément ex. fois++

Yoshi a écrit :

Et aussi
for (int jeu=0; jeu<100; jeu++, cas++)
Boucle à pas variable de 1 à 6 ?

Bon, ça ce sont les étapes de mise au point. Il se trouve que je n'ai pas réussi du premier coup à utiliser "cas" comme il fallait. Dans la partie incrément on peut mettre autant d'actions que l'on veut, séparé par des virgules. En l'occurrence, cas++ ne sert rigoureusement à rien.

voila le résultat. On constate que le gain de l'homme dépasse 80 pour 100, comme je l'avais constaté avec la liste de Yassine
Méthode Dlzlogic TgagneX = 1831  TgagneY = 8169
Méthode Dlzlogic TgagneX = 1811  TgagneY = 8189
Méthode Dlzlogic TgagneX = 1819  TgagneY = 8181
Méthode Dlzlogic TgagneX = 1838  TgagneY = 8162
Méthode Dlzlogic TgagneX = 1826  TgagneY = 8174
Méthode Dlzlogic TgagneX = 1802  TgagneY = 8198
Méthode Dlzlogic TgagneX = 1796  TgagneY = 8204
Méthode Dlzlogic TgagneX = 1849  TgagneY = 8151
Méthode Dlzlogic TgagneX = 1846  TgagneY = 8154
Méthode Dlzlogic TgagneX = 1864  TgagneY = 8136
Méthode Dlzlogic TgagneX = 1853  TgagneY = 8147
Méthode Dlzlogic TgagneX = 1786  TgagneY = 8214
Méthode Dlzlogic TgagneX = 1865  TgagneY = 8135
Méthode Dlzlogic TgagneX = 1831  TgagneY = 8169

Concernant les avis sur Python, il me semble que rien n'interdit d'avoir un avis différent d'autres et de le dire.

Hors ligne

#95 02-08-2016 17:10:09

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Peut - on battre le hasard ?

yoshi a écrit :

        x1=randint(1,2014)  
        r = 2016-x1
        r=max(r,2)
        x2=randint(1,r)
        x3=2016-x1-x2
        Lm=[x1,x2,x3]
        Lm.sort()
        x1,x2,x3=Lm
 

Hé hé, cela ne respecte pas les règles du jeu non plus, mais c'est plus subtile que pour le dernier code de Dlzlogic.

En effet, le code produit bien un triplet croissant strictement positif de somme 2016 (attention , c'est r = 2015-x1 (et non 2016-x1) ),
mais pas suivant la loi uniforme :
en effet, par exemple, le code produit [1,1,2014] environ 1344 fois plus souvent que [672,672,672]  .



Autre remarque :  r=max(r,2) est inutile

Dernière modification par leon1789 (02-08-2016 19:26:37)

Hors ligne

#96 02-08-2016 17:14:15

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

Léon a écrit :

Cela ne respecte toujours pas les règles du jeu.

En effet, en première ligne x1 peut valoir 2016, puis r=0 , puis r=2, puis x2 = 1 ou 2 , puis x3 = -1 ou -2, et le triplet trié produit est (-1, 1, 2016) ou (-2, 2, 2016) !

Tu as parfaitement raison, c'est une faute.

Léon a écrit :

    int x1 = rand(1 ... 2016/3)   
    int x2 = rand(x1 ... (2016-x1)/2)         
    int x3 = 2016-x1-x2             
    // ici, 1 <= x1 <= x2 <= x3     et   x1+x2+x3=2016

Pourquoi pas. Mais, cela n'évite par la remise en ordre.
De toute façon, l'énoncé demande de définir la stratégie suivie par l'homme puis de démontrer que l'homme gagne à plus de 75%.
Mon programme ne sert qu'à vérifier. La stratégie, je l'ai expliquée, la démonstration à mieux que 75%, je ne sais pas le faire. Naturellement une vérification n'est pas suffisante pour ce dernier point. Par contre, si on accepte "en moyenne" alors la vérification (sous réserve des fautes) suffit comme démonstration.

Hors ligne

#97 02-08-2016 17:21:19

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Peut - on battre le hasard ?

Dlzlogic a écrit :
Léon a écrit :

    int x1 = rand(1 ... 2016/3)   
    int x2 = rand(x1 ... (2016-x1)/2)         
    int x3 = 2016-x1-x2             
    // ici, 1 <= x1 <= x2 <= x3     et   x1+x2+x3=2016

Pourquoi pas. Mais, cela n'évite par la remise en ordre.

Si si, cela evite aussi la remise en ordre puisque 1 <= x1 <= x2 <= x3  .

Dlzlogic a écrit :

De toute façon, l'énoncé demande de définir la stratégie suivie par l'homme puis de démontrer que l'homme gagne à plus de 75%.

Mais l'homme joue contre la machine, et il faut que la machine choisisse un triplet croissant strictement positif de somme 2016 suivant la loi uniforme (c'est l'hypothèse du problème). Donc pour faire une bonne simulation, il faut programmer cela correctement.
Si la machine joue autrement, alors le taux de réussite va changer... et peut largement descendre en dessous de 50% ou montrer à 85%.

Hors ligne

#98 02-08-2016 17:24:11

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

@ Tibo,
Il me semble que c'est la première fois que je fais une citation sans donner de façon précise mes sources. De façon précise c'est à dire que je cite les auteurs et qu'ils ont une compétence incontestable en la matière.
Si tu as un exemple contraire, dis-le, j'essayerai de préciser et de justifier.
Contrairement à ce que tu sembles sous-entendre, s'il peut m'arriver de me tromper, je ne dis jamais sciemment des choses sans en être parfaitement sûr et d'être tout prêt à le prouver, ou à rectifier si je me suis trompé.

Hors ligne

#99 02-08-2016 17:42:21

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Peut - on battre le hasard ?

@Léon
Voilà, j'ai fait ta modif, ça donne ça.
Méthode Dlzlogic TgagneX = 2249  TgagneY = 7751
Méthode Dlzlogic TgagneX = 2322  TgagneY = 7678
Méthode Dlzlogic TgagneX = 2275  TgagneY = 7725
Méthode Dlzlogic TgagneX = 2296  TgagneY = 7704
Méthode Dlzlogic TgagneX = 2256  TgagneY = 7744
Méthode Dlzlogic TgagneX = 2190  TgagneY = 7810
Méthode Dlzlogic TgagneX = 2267  TgagneY = 7733
Méthode Dlzlogic TgagneX = 2307  TgagneY = 7693
Méthode Dlzlogic TgagneX = 2249  TgagneY = 7751
Donc, un peu plus de 75%
"La machine écrit sur une bande de papier trois nombres entiers positifs pas nécessairement distincts x1≤x2≤x3 tirés au hasard et dont la somme x1+x2+x3=2016 . "
Il est dit "au hasard", et il est ajouté que les nombres ne sont pas nécessairement distincts. Mais tout ça n'est qu'un détail.
On aurait très bien pu tirer 2 nombres sur 1 à 2014, et si la somme ne dépasse pas 2015, en déduire de 3è nombre, sinon on recommence.

Hors ligne

#100 02-08-2016 18:09:07

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Peut - on battre le hasard ?

Dlzlogic a écrit :

(...)
  int y01=482;
  int y02=767;
  int y03=767;
(...)
// méthode Dlzlogic basée sur le complément à la moyenne des X gagnant
// le troplet de départ est 482 767 767
/* à partir de celui-là,
1- on diminue y1 de 1
2- on augmente de 1 y2
3- on augmente de 1 y3
4- on diminue encore y1
5- on augmente de 1 y2 et y3
6 à 10 la même chose dans l'autre sens
*/
      int y1, y2, y3;
      cas = jeu/6+1;
      switch (jeu%6+1)
      {
        case 1:
        y1=y01-cas; y2=y02+cas; y3=y03; break;
        case 2:
        y1=y01-cas; y2=y02; y3=y03+cas; break;
        case 3:
        y1=y01-cas*2; y2=y02+cas; y3=y03+cas; break;
        case 4:
        y1=y01+cas; y3=y02-cas; y2=y03; break;     // y3 >= y2
        case 5:
        y1=y01+cas; y3=y02; y2=y03-cas; break;
        case 6:
        y1=y01+cas*2; y3=y02-cas; y2=y03-cas; break;
      }
(...)
 

Dlzlogic, je crois que ton code ne produit pas toujours des triplets "humains" croissants : par exemple pour jeu=0, on a
cas = 1 
et ensuite y1 = 481 , y2 = 768, y3 = 767

Dernière modification par leon1789 (02-08-2016 18:13:18)

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt quatre moins vingt quatre
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums