19-06-2013, 09:16 PM
D'accord, cela renverse le problème:
il ne s'agit donc plus de prédire un évènement aléatoire mais de donner une apparence aléatoire à un évènement prédictible.
Une première possibilité:
Coté serveur:
Choisir un algorithme pseudo aléatoire répandu (mersenne twister par exemple)
Choisir un seed pour cet algorithme (seed aléatoire si on veut)
Générer N valeurs et les stocker
Ensuite, il suffit d'envoyer au client le seed utilisé, l'algorithme choisi (ca, normalement, c'est "envoyé" au client via le code du javascript lui-même, en d'autres mots, il faut que l'algorithme pseudo aléatoire soit le même coté client et serveur) ainsi que le n° du dernier nombre tiré.
Connaissant ces données, le client peut générer la même liste que le serveur, et sachant quel est le dernier n° tiré, le client est capable de savoir quel sera le prochaine n° tiré.
On peut alléger le coté serveur en ne stockant que le seed et le n° du dernier tirage: ainsi, pour trouver le nombre suivant, il suffit d'initialiser l'algorithme pseudo aléatoire avec le seed stocké, et de faire défiler (n°) tirages aléatoires pour trouver le prochain nombre.
Exemple:
Coté serveur, je décide que d'utiliser mersenne twister. Je choisis le seed 1000 (lui-même aléatoire).
Le n° du dernier tirage est -1, puisque j'ai jamais fait de tirage.
J'envoie au client le couple (1000,-1), pour qu'il sache que le seed est 1000, et le dernier tirage -1.
Le client initialise l'algorithme mt_srand(1000). Il génère ainsi une grille de 100 nombres aléatoires:
Maintenant, un coup est porté. Le client sait que le dernier nombre est -1, et il sait donc que le serveur va tirer 753084335.
Le serveur exécute le code suivant:
Le serveur tire donc bien 753084335.il ne s'agit donc plus de prédire un évènement aléatoire mais de donner une apparence aléatoire à un évènement prédictible.
Une première possibilité:
Coté serveur:
Choisir un algorithme pseudo aléatoire répandu (mersenne twister par exemple)
Choisir un seed pour cet algorithme (seed aléatoire si on veut)
Générer N valeurs et les stocker
Ensuite, il suffit d'envoyer au client le seed utilisé, l'algorithme choisi (ca, normalement, c'est "envoyé" au client via le code du javascript lui-même, en d'autres mots, il faut que l'algorithme pseudo aléatoire soit le même coté client et serveur) ainsi que le n° du dernier nombre tiré.
Connaissant ces données, le client peut générer la même liste que le serveur, et sachant quel est le dernier n° tiré, le client est capable de savoir quel sera le prochaine n° tiré.
On peut alléger le coté serveur en ne stockant que le seed et le n° du dernier tirage: ainsi, pour trouver le nombre suivant, il suffit d'initialiser l'algorithme pseudo aléatoire avec le seed stocké, et de faire défiler (n°) tirages aléatoires pour trouver le prochain nombre.
Exemple:
Coté serveur, je décide que d'utiliser mersenne twister. Je choisis le seed 1000 (lui-même aléatoire).
Le n° du dernier tirage est -1, puisque j'ai jamais fait de tirage.
J'envoie au client le couple (1000,-1), pour qu'il sache que le seed est 1000, et le dernier tirage -1.
Le client initialise l'algorithme mt_srand(1000). Il génère ainsi une grille de 100 nombres aléatoires:
Code :
0 753084335
1 1694858333
2 246975523
3 1310787424
4 115944203
5 2115752409
6 1123256280
7 774816128
8 283560872
9 327653942
10 1684423386
11 2130080352
12 87423252
13 1398537922
14 852968622
15 1775019291
16 500647570
17 1829113182
18 1807624438
19 919118209
20 1707760099
21 497724395
22 541247650
23 1947017330
24 1299836476
25 129545465
26 391392911
27 2113765122
28 543668698
29 211595471
30 2007229881
31 1755136974
32 236539833
33 1974903052
34 2045788262
35 305456159
36 1999615310
37 525128298
38 1248272920
39 1414251589
40 2097045177
41 1023438599
42 49866472
43 1753044770
44 729366374
45 516923397
46 624905388
47 911176403
48 777125072
49 358878892
50 2067115247
51 288349692
52 305756667
53 123643954
54 728438645
55 903863614
56 491393804
57 346019037
58 1189893294
59 1715179299
60 1900722616
61 44501693
62 217532971
63 843651190
64 22380431
65 2085033039
66 160109366
67 587035839
68 1612445686
69 554291827
70 1851511841
71 12113357
72 1498782743
73 1510943389
74 855138471
75 1600639048
76 1896490466
77 1988392749
78 1751168120
79 479794419
80 1209522032
81 429079554
82 38962237
83 1185711533
84 1484851500
85 333850514
86 1129654207
87 384589825
88 1864523984
89 66560555
90 224174178
91 189440053
92 181159731
93 682638453
94 1981280807
95 1375821209
96 2056964493
97 1465893082
98 941828119
99 792112746
Le serveur exécute le code suivant:
Code PHP :
<?php
//__LAST__ est le n° du dernier tirage effectué, ici, -1.
mt_srand(1000);
for ($i=0;$i<=__LAST__;$i++)
mt_rand();
return (mt_rand());
?>
Coté client, le compteur (n° du dernier tirage) est incrémenté, idem coté serveur.
Les deux ont donc exactement les mêmes tirages pseudo-aléatoires.
En revanche, connaissant le seed, le client sera capable, quoiqu'il arrive, de prédire tous les tirages à venir, donc, on pourrait tricher, et abandonner le combat en sachant que les tirages pour ce combat sont un peu "moisis"...