Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#76 01-08-2016 14:25:57
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Peut - on battre le hasard ?
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 ?
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...
@+
En 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 :
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...
@+
En 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)
En 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
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)
En 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)
En 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.
*/
{
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/
En 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
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 :
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 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.
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 :
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.
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++
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 ?
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 ?
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.
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 ?
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=2016Pourquoi pas. Mais, cela n'évite par la remise en ordre.
Si si, cela evite aussi la remise en ordre puisque 1 <= x1 <= x2 <= x3 .
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 ?
(...)
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







