Avertissement :Il s'agit d'une page optimisée pour la navigation mobile. Voir la
page originale.
J'ai besoin de vous tous !!
ld le 29/11/2010 à 11:35
Salut à tous, J'ai besoin de vous pour résoudre un problème de taille !
Voilà je suis sur le point de terminer un prgm mais il me manque une suite de
commande des plus essentiel...
Je garde le programme secret, si je le finit, il sera publié !
J'en ai trouver une mais elle est très longue et relève du casse tête,
elle ralentit par conséquent méchamment le prgm...
Voici le défit:
Trouver une suite de commande la plus courte et la plus simple qu'il soit,
générant de façon homogène et aléatoire les 4 résultats suivant:
(A=1 et B=0) ou (A=-1 et B=0) ou (A=0 et B=1) ou (A=0 et B=-1)
Si le résultat A=0 et B=0 doit apparaître, ce n'est pas trop grave car
on peut répéter l’algorithme et trouver l'un de c'est 4 résultats...
Les résultat doivent être stoker dans 2 variables comme ici et les probabilités doivent impérativement être égal pour chacun des résultats...
Ça peut paraître simple pour certains, perso moi je ne trouve rien qui me conviens. Alors à vos neurones et poster moi vos idées !
Toutes mes félicitation à celui ou celle qui trouvera !
Merci d’avance... Louis davin.

Sangohan38 le 29/11/2010 à 12:27
Code
Lbl 0
Int rand(2->A
Int rand(2->B
If A+B=0: Goto 0
Ça te suffit pas?
Sangohan38
ld le 29/11/2010 à 13:06
Euh,super... Ça donne quoi en Stat.fr ?

ld le 29/11/2010 à 13:10
A oui fichtre, C'est vrai qu'elle question !
Il y à le lien sous ton message.

ld le 29/11/2010 à 13:17
C'est bien ça n'es pas:
ent(NbrAléat(2))-)A et pareil pour B.
Moi ça me donne 02 02 02 02 02... (A=0;B=2).

metallica le 29/11/2010 à 19:06
ça donne plutôt:
Code
entaleat(-1,1-)A
If non(A
entaleat(-1,1-)B
Sangohan38 le 29/11/2010 à 20:40
Moi je suis un vieux de la vielle qui programme encore comme sous 82 non STATS donc c'est plutôt int rand(2+1->A.
J'ai voulu essayé de simplifier mais visiblement ça marche pas.
Sangohan38ld le 30/11/2010 à 11:45
Ça ne donne toujours pas les bons résultats:
j'ai:
0 -1
-1 -1
1 -1
0 0
0 -1
1 -1
0 1linkakro le 30/11/2010 à 18:18
Je trouve celui de Metallica presque parfait.
Mais je ne sais pas si les probabilités sont équivalentes car si A est nul, la valeur de B dépend de la valeur précédente de B. De plus B risque d'avoir n'importe quelle valeur, et l'initialiser risque de biaiser l'équiprobabilité.
Celui de Sangohan ne fait pas de négatif, mais sa démarche me convient bien.
Code
Lbl 0
entaléat(-1,1)->A // Int (rand3)-1->A
entaléat(-1,1)->B
If A+B=0
Goto 0
PS: biaiser n'est pas une coquille (faute de frappe).
Sangohan38 le 30/11/2010 à 19:01
Je viens de remarquer à l'instant qu'on peut encore raccourcir le code en mettant une boucle conditionnelle:
While A+B=0
entaléat(0,1->A // Int (rand3)-1->A
entaléat(0,1->B
End
Par contre ça nécessite que A et B ne soient pas égales à 0.
Sangohan38metallica le 30/11/2010 à 19:37
Sans faire de boucle:
Code
entaleat(-1,1-)A
EffVar B
If non(A
entaleat(-1,1-)B
linkakro le 30/11/2010 à 20:03
Metallica : il y a toujours une petite question de probabilité, mais la cohérence est assurée.
EDIT= L'aléat de B risque de générer un 0 même si A=0
Sangohan38 : utilise une boucle Repeat, elle ne fait pas de test à l'entrée.
Code
Repeat A+B
entaléat(-1,1->A // Int (rand3)-1->A
entaléat(-1,1->B
End
EDIT= Sangohan38 persiste dans l'omission des négatifs. Je ne m'en étais pas rendu compte, et ma re-modification contenait donc cette erreur.
J'édite tout de suite le code.
EDIT= Mes solutions de boucles sont fausses :
-Les A+B de sangohan sont justes car il omet les négatifs. (donc autre problème)
-Mes A+B ne suffisent plus car je traîte les négatifs.
Il y a deux solutions de comprommis. J'en développerai au moins une.
ld le 01/12/2010 à 11:12
Bon, sa va vous donner de mauvaises idées etvous aurez tantence à copier sur moi,(vous n'y pouvait rien le cerveau une fois qu'il à vu une solution il a la flème d'en trouver une autre...), mais tanpis je vousmontre la mienne, nan nan pas c'elle que tupensse ! (Cà aussi c'est le cerveau...)
Je parle de la solution, qui est, là voici:
Code
:Lbl 0
:If EntAléat(0,1)=1
:Then
:EntAléat(-1,1)-)A:If A=0:EntAléat(-1,1)-)B
:Else
:EntAléat(-1,1)-)B:If B=0:EntAléat(-1,1)-)A
:End
:If A+B=0:Goto 0
:Disp A,B
But like I'say you "Fichtre !".
Mais comme je vous le disez, c'est bien tros long et mon prgm doit être plutôt veloce pour fonctionner correctement...
Je compte sur vous tous pour trouver et merci pour toutes vos idées...

ld le 01/12/2010 à 11:18
J'ai trouver plus court :
Code
:entAléat(-1,1)-)A
:If A=0:Then
:If entAléat(0,1)=1:Then:-non(A)-)B:Else:non(A)-)B:End
:Else
:non(A)-)B:End
:Disp A,B
ld le 01/12/2010 à 11:20
Encore plus court !
Code
:entAléat(-1,1)-)A
:If A=1 et entAléat(0,1)=1:Then:-non(A)-)B:Else:non(A)-)B:End
:Disp A,B
ld le 01/12/2010 à 11:32
Re plus court !
Mais là je ne sais pas si c'est toujours équiprobable.
Code
:entAléat(-1,1)-)A
:If entAléat(0,1)=1:Then:-non(A)-)B:Else:non(A)-)B:End
:Disp A,B
PS: Es'que si on laisse "A=0 et" le prgm ne lira pas la reste
de l’instruction lorsque A=0 et que par conséquent il irait plus vite ???
J'ai tester toutes vos propositions, une en particulier me semble satisfaisante
et me semble être assez courte et rapide pour ce que je souhaite faire...

Je panse qu'on en tient le bout !

linkakro le 01/12/2010 à 18:12
Je n'ai pas compris ta question.
---
Quel code t'a le mieux convenu ?
---
J'ai apporté de grosses corrections à mon
dernier message
Je
résume et corrige ce que j'avais commenté.
Metallica : B risquait d'être nul même avec A=0
Je doute toujours de l'équiprobabilité.
Code
entaléat(-1,1)->A
EffVar B
If non(A
2entaléat(0,1)-1->B
sangohan et moi-même : Soit il n'y avait pas de négatif, soit la boucle était faussée par les négatifs (-1+1=0).
Code
Repeat abs(A)+abs(B)=1
entaléat(-1,1)->A
entaléat(-1,1)->B
End
Edit: j'ai ajoûté =1 pour me rapprocher du cahier des charges.
metallica le 02/12/2010 à 17:25
linkakro a écrit :
Code
entaléat(-1,1)->A
EffVar B
If non(A
[b]2entaléat(0,1)-1->B[/b]
A la place de la dernière phrase, il me semble avoir écrit:
Sinon, pour l"équiprobalité parfaite:
Code
entaleat(0,1
If Rep:Then
entaleat(-1,1-)A
Effvar B
If non(A
entaleat(-1,1-)B
Else
entaleat(-1,1-)B
Effvar A
If non(B
entaleat(-1,1-)A
End
linkakro le 02/12/2010 à 19:41
J'ai corrigé ton précédent code, et c'était précisé un peu au dessus.
Si je ne me suis pas trompé dans la correction et le constat, il y avait un risque de deux fois 0.
Ma correction supprimait ce risque en conservant les probabilités.
Cette fois j'ai foi en l'équiprobabilité. Même si pas sûr.
Si on étend ma correction à ta nouvelle version, on doit tendre vers la perfection, mais avec un peu de poids.ld le 06/12/2010 à 10:31
J'ai eu raison de penser que si on voulait faire plus cours et plus rapide
il fallait utiliser des listes ou des matrices.
Je pense avoir trouver et qu'on ne peut plus faire plus simple et rapide
que cela, la boucle fait 2 instructions, soit le minimum pour donner une
valeur aux deux variables A et B.
Code
:{0,4,0,-4}-)L1:{4,0,-4,0}-)L2
:While 1
:entAléat(1,4)-)L
:L1(L)-)C:L2(L)-)D
:Disp A,B
:End
C'est enfin assez rapide pour mon prgm !
J'incorporerais c'est lignes de commandes et je le publie aussitôt dans...
Surprise...
Algorithme générateur de labyrinthe.

linkakro le 06/12/2010 à 21:55
Je viens de comprendre que je n'avais pas compris tout ton cahier des charges.
Certains de nos travaux précédent ne collent pas.
L'astuce des listes est extra. Bravo.ld le 07/12/2010 à 11:18
C'est super de ta part de m'avoir aider Linkakro.
Si tu pense que toutes tes lignes de commandes qui ne collaient
pas à mon prgm seront perdues, sachez tous que vos efforts n'aurons
pas était vains, je les ais toutes garder pour un nouveau prgm inédit.
Je cherche...Je cherche...
Encore merci à tous !

metallica le 07/12/2010 à 18:09
De rien mais c'est vrai que ton algorithme est de loin meilleur que le mien. Avertissement :Il s'agit d'une page optimisée pour la navigation mobile. Voir la
page originale.