D'accord, je fais des recherches sur la manière dont les numéros aléatoires sont générés avec la méthode Math.Random. Jusqu'à présent, j'ai appris que cela commence par une graine "aléatoire" et que la graine est branchée dans une équation complexe pour créer un nombre aléatoire. Si la graine est toujours la même, le résultat sera-t-il toujours le même?
J'ai entendu dire que les graines de Math.Random sont générées à travers l'heure actuelle, est-ce correct? Ils doivent utiliser l'heure actuelle jusqu'à la mili-secondes ou quelque chose comme ça, car si vous n'avez pas eu le même résultat. P>
Quelle est exactement la graine? Est-ce l'heure comme "10:45" ou l'heure et la date telles que "10:45 11/8/8/12/12" ou une combinaison? P>
Comment puis-je trouver la graine, donc je peux donc prédire La sortie? P>
Je veux pouvoir brancher ceci: p> dans ma barre d'URL et être capable de prédire le résultat. Est-ce possible? P> p>
4 Réponses :
La graine est une valeur numérique, alors je suppose que ce serait ce que vous obtenez si vous appelez Cependant, je ne suis pas sûr lorsque cette graine est prise ou si la graine est isolée à la page en cours ou commune à l'ensemble du processus de navigateur. Prédire des nombres aléatoires est censé être très difficile ou impossible, c'est tout le point d'être aléatoire. P> date.now () code> (ou
nouvelle date (). / code> pour les navigateurs plus âgés). P>
Il est probable qu'il y ait probablement plus à la graine que le nombre de millisecondes, car vous pouvez appeler des maths.random () plusieurs fois dans le même milliseconde et il retournera une valeur différente à chaque fois.
Math.random = function () { return .5; };
@ 43.52.4d. Il y a une façon de savoir. Commencez à le faire, dans dix ans, nous aurons la réponse, ce qui signifie que si c'est possible ou non ... Es-tu réel ?!
Voici le code derrière Chrome's Math.Random (): coder.google.com/p/v8/source/browse/trunk/src/v8.cc#170 On dirait que cela va essentiellement utiliser le générateur de nombres aléatoires de votre système, de sorte que cela dépend finalement sur votre système d'exploitation.
Non, vous ne pouvez pas prédire la graine, mais vous pouvez générer suffisamment de chiffres afin de brute avec précision une correspondance. P>
Quoi qu'il en soit, début de la page wiki sur la page wiki sur RNG - http://fr.wikipedia.org/ wiki / aléatoire_number_generation , examiner les implémentations pratiques des PRNG. P>
J'ai regardé à travers le rhinocéros Code source Pour savoir quelle fonction pseudo-aléatoire utilisée. Apparemment, ils Toile de retour à la fonction La documentation pour retourne une double valeur avec un signe positif, supérieur ou égal à 0,0 et moins de 1,0. Les valeurs retournées sont choisies pseudorandommy avec une distribution uniforme (approximativement) à partir de cette plage. P>
Lorsque cette méthode est appelée pour la première fois, elle crée un seul nouveau générateur de numéros pseudorandom, exactement comme si l'expression p>
blockQuote> Ce nouveau générateur de numéros pseudorandom est utilisé par la suite pour tous les appels vers cette méthode et est utilisé nulle part ailleurs. P>
Cette méthode est correctement synchronisée pour permettre une utilisation correcte par plus d'un fil. Toutefois, si de nombreux threads doivent générer des chiffres de pseudorandom à un gros taux, il peut réduire la conflit pour chaque thread d'avoir son propre générateur de numéros pseudorandom. P>
blockQuote> J'ai vérifié la documentation pour crée un nouveau générateur de nombres aléatoires. Sa graine est initialisée à une valeur basée sur l'heure actuelle: p>
blockQuote> Deux objets aléatoires créés dans le même milliseconde auront la même séquence de nombres aléatoires. P>
BlockQuote> Alors maintenant, nous savons certainement que la graine est l'heure actuelle en millisecondes. En outre, la documentation pour le Deuxième constructeur dit: P> crée un nouveau générateur de nombres aléatoires à l'aide d'une seule longue graine: P>
blockQuote> Utilisé par méthode à côté de la maintien de l'état du générateur de numéros pseudorandom. P>
blockQuote> le Documentation pour la méthode code> SetSeed code> dit: p> Définit la graine de ce générateur de nombres aléatoires à l'aide d'une seule longue graine. Le contrat général de l'établissement est qu'il modifie l'état de cet objet générateur de nombres aléatoires afin d'être exactement le même état que s'il venait d'être créé avec la graine d'argument comme une graine. La méthode établie est implémentée par classe aléatoire comme suit: p>
blockQuote> La mise en oeuvre de la classée par classe arrive à n'utiliser que 48 bits de la graine donnée. En général, toutefois, une méthode primordiale peut utiliser tous les 64 bits de la longue argumentation en tant que valeur de semences. Remarque: bien que la valeur de la graine soit un atomiclong, cette méthode doit toujours être synchronisée pour assurer une sémantique correcte de HavenextNextgaussien. P>
blockQuote> le Méthode réelle Utilisé pour générer le nombre aléatoire est retourne le pseudorandom suivant, une double valeur de manière uniforme comprise entre 0,0 et 1,0 de cette séquence de générateur de nombres aléatoires. P>
BlockQuote> La mise en œuvre de la fonction clairement il dépend de sur le génère le prochain numéro pseudorandom. La sous-classe devrait remplacer cela, car cela est utilisé par toutes les autres méthodes. P>
blockQuote> La mise en œuvre de la fonction C'est la fonction pseudo-aléatoire que vous recherchez. Comme il est dit dans la documentation: P> Il s'agit d'un générateur de numéro de Pseudorandom congruentiel linéaire, tel que défini par D. H. Lehmer et décrit par Donald E. Knuth dans l'art de la programmation informatique, Volume 2: algorithmes séminumériques, section 3.2.1. P>
BlockQuote> Notez cependant que ce n'est que le générateur de nombres aléatoires utilisé par Rhino. D'autres implémentations comme SpiderMonkey et V8 peuvent avoir leurs propres générateurs de nombres pseudo-aléatoires. P> p> math.random code> définie dans le Java Standard Library .
math.random < / code> dit: p>
java.util.random code> et trouvé Ceci (pour le constructeur par défaut): P>
NextDouble code>: P>
Nexdouble code> est la suivante: p>
suivant code> Fonction: p>
suivante est la suivante: p>
+1, une réponse merveilleuse, cela signifie donc au moins que je peux énumérer une gamme de temps possibles en fonction de la précision du temps, et au moins, je pourrais obtenir une liste de numéros aléatoires possibles (ce qui est certainement dangereux pour des raisons de sécurité). Mais pour la question initiale, probablement non, à moins que vous ne puissiez bien obtenir le milliseconde.
@AADIT Vous avez raison que cela dépend de la mise en œuvre, si vous écrivez une webApp à l'aide de JavaScript, différents navigateurs Web utilisent différents générateurs de numéros pseudorandom. Pour des applications spécifiques, cela peut causer des ravages. Les méthodes de congruence linéaire sont notoirement mauvaises à avoir toutes les propriétés "aléatoires" souhaitées - fortes corrélations série. Voir Stackoverflow.com/Questtions/ 19507469 / ... . Grande réponse BTW.
Tout le point de
math.random () code> est que vous ne pouvez pas le prédire (au moins, pas sans grande difficulté).
Y a-t-il quelqu'un qui lise la source pour
v8 code> ici pour nous donner une réponse définitive pour cela?
@Tianshuo - J'ai lu le code source de Rhino et j'ai répondu à la question basée sur ce que j'ai lu: Stackoverflow.com/a/13303029/783743 < / a>