2009-11-24 3 views
2

J'utilise une implémentation en C# de Mersenne Twister que j'ai téléchargée depuis CenterSpace. Je pose deux problèmes:Mersenne Twister: ensemencement et visualisation

  1. Peu importe comment je sème l'algorithme, il ne passe pas DieHard tests, et je veux dire que je reçois beaucoup de 1 et de 0 pour valeur p. Aussi mon KStest sur 269 p-values ​​est 0. Eh bien, je ne peux pas tout à fait interpréter p-value, mais je pense que quelques 1 et 0 dans le résultat sont de mauvaises nouvelles.
  2. On m'a demandé de montrer visuellement le caractère aléatoire des nombres. Donc, je trace les chiffres comme ils sont générés, et cela ne semble pas aléatoire du tout. Voici deux captures d'écran du résultat after a few seconds et a few seconds later. Comme vous pouvez le voir sur la deuxième capture d'écran, les chiffres tombent sur des lignes parallèles. J'ai essayé différents algorithmes pour mapper des nombres aux points. Ils se traduisent tous par des lignes parallèles, mais avec des angles différents! Voici comment j'ai mappé des nombres à des points pour ces captures d'écran: new Point(number % _canvasWidth, number % _canvasHeight). Comme vous pouvez le deviner, le résultat visuel dépend de la largeur et de la hauteur du formulaire, et this is un résultat désastreux.

Voici quelques façons que j'ai essayé de semer l'algorithme:

  1. entrée de l'utilisateur. J'entre des nombres pour ensemencer l'algorithme en tant que tableau int.
  2. Numéros aléatoires générés par l'algorithme lui-même !!
  3. Un tableau de new Guid().GetHashCode()

Qu'est-ce que je manque ici? Comment devrais-je semer l'algorithme? Comment puis-je faire passer le DieHard?

Répondre

3

Bien que je ne puisse pas parler de votre premier point, le deuxième problème concerne la façon dont vous calculez les points à utiliser. Plus précisément,

x = number % _canvasWidth; 
y = number % _canvasHeight; 

vous donnera un « modèle » qui correspond un peu au rapport d'aspect de la fenêtre que vous dessinez à. Par exemple, si _canvasWidth et _canvasHeight étaient égaux, vous dessinez toujours sur une seule ligne diagonale comme x et y serait toujours le même. Cette représentation graphique ne serait pas appropriée dans ce cas, alors.

Qu'en est-il de prendre les N bits de la sortie RNG et d'utiliser la moitié pour la coordonnée x et l'autre moitié pour la coordonnée y? Pour les bits qui tombent hors des limites de votre fenêtre, vous pouvez envisager deux options:

  1. Ne pas les dessiner (ou les dessiner) offscreen
  2. Effectuer une interpolation linéaire pour cartographier la gamme de bits à la largeur/hauteur de votre fenêtre

L'une ou l'autre option devrait vous donner une image plus représentative des bits que vous obtenez de votre générateur de nombres aléatoires. Bonne chance!

+0

Merci pour la réponse fbrereto. Votre observation sur la largeur et la hauteur égales est très vraie. Je ne sais pas comment j'ai raté cela :) Voici comment j'ai commencé le mappage: var x = (int) (nombre & 0xffff0000); var y = nombre & 0x0000ffff; x = x% _canvasWidth; y = y% _canvasHeight; Ceci est en quelque sorte similaire à votre solution; Cependant, je pense que la fonction mod fausse toujours le résultat. FYI cette cartographie a provoqué des lignes parallèles verticales! –

+0

vous devez décaler vos valeurs x; après le masque de bits, ils se trouveront dans les deux octets supérieurs de votre sortie numérique, qui seront tous de gros chiffres qui pourraient fausser votre mod. – fbrereto

+0

mod montrera probablement toujours un biais lorsque vous tracez les résultats à l'écran. Avec ce que vous essayez de faire, je recommande de ne pas dessiner de grandes coordonnées (celles en dehors de la fenêtre) ou une interpolation linéaire. – fbrereto

-1

La génération de nombres aléatoires réels ne peut pas être effectuée avec une fonction mathématique. S'il est important d'avoir des nombres vraiment aléatoires, obtenez un hardware random number generator. J'ai développé des jeux de poker en ligne en argent réel - un tel matériel est la seule façon d'être sûr qu'il n'y a pas de modèles dans les chiffres.

Si vous ciblez un environnement Linux, les /dev/random and /dev/urandom pseudo devices font beaucoup mieux qu'un générateur mathématique, car ils incorporent des nombres aléatoires représentant l'activité matérielle.

+0

Merci pour la réponse. Il y a tellement de sites de jeux en ligne qui utilisent Mersenne Twister pour RNG: http://practice.galewindsoftware.ca/demo/casino/help/certified/RNG_Certification_Galewind_Software.pdf et http://www.pkr.com/ fr/support/licensing-and-integrity/certificats-mensuels/ –

+0

-1: Ceci est FUD. L'algorithme Twister de Mersenne produit des nombres aléatoires extrêmement bons. C'est l'algorithme de nombre aléatoire par défaut pour Python. Bien que techniquement pseudo-aléatoire, il a une période de répétition ridicule - plus grande que le nombre de particules dans l'univers observable. Votre argument n'est pas fondé. –

+1

Voulez-vous parier de l'argent sur, disons, un site de blackjack qui a utilisé une certaine implémentation de la Mersenne Twister? Si une implémentation peut être affichée correcte et honnête, c'est beaucoup plus de travail que de simplement brancher un générateur de nombres aléatoires. – wallyk

0

Votre problème de tracé de points rayés devrait être facilement résolu en générant un nouveau nombre aléatoire pour chacune des coordonnées x et y. Essayer de réutiliser un seul nombre généré pour x et y est fondamentalement une optimisation prématurée, mais si vous descendez cette route, assurez-vous d'extraire des bits différents pour chacun d'eux à partir du nombre; Tel quel, x=n%width;y=n%height vous donne une énorme corrélation entre x et y, comme vous pouvez le voir dans vos images.

J'utilise diverses implémentations C++ Mersenne Twister depuis des années (plus récemment boost « s) pour générer randompoints et n'a eu aucune difficulté avec elle (semence liée ou non). C'est vraiment un superbe générateur.

+0

L'utilisation de deux nombres pour tracer des sons ressemble à une solution pour mon deuxième problème, mais pour une raison quelconque, je me sens coupable!Je veux dire à l'utilisateur, et peut-être auditeur, chaque point représente un nombre! Avec votre expérience avec MT, comment semez-vous habituellement? Des commentaires sur dieHard? –

Questions connexes