Question

J'utilise une implémentation C # de Mersenne Twister j'ai téléchargé CenterSpace . Je pose deux problèmes:

  1. Peu importe comment je sème l'algorithme, il ne passe pas essais DieHard , et je veux dire que je reçois beaucoup de 1 et de 0 pour valeur p. Aussi mon KStest sur 269 valeurs p est égal à 0. Je ne peux pas interpréter tout à fait valeur p, mais je pense que quelques 1 et de 0 dans le résultat de mauvaises nouvelles.
  2. On m'a demandé de montrer visuellement le caractère aléatoire des nombres. Donc, je tracer les chiffres car ils sont générés, et cela ne semble pas du tout hasard. Voici deux captures d'écran du après quelques secondes et quelques secondes plus tard . Comme vous pouvez le voir dans la capture d'écran seconde les chiffres tombent sur des lignes parallèles. J'ai essayé différents algorithmes pour cartographier le nombre de points. Ils se traduisent toutes par des lignes parallèles, mais avec des angles différents! Voilà comment je cartographié les numéros aux 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 de la forme et de la hauteur, et c'est un résultat disasterous.

Voici quelques façons que j'ai essayé aux semences l'algorithme:

  1. Entrée utilisateur. J'entre quelques chiffres pour semer l'algorithme comme un tableau int.
  2. Les nombres 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 dois-je semer l'algorithme? Comment puis-je obtenir passer le DieHard?

Était-ce utile?

La solution

Alors que je ne peux pas parler à votre premier point, le deuxième problème a à voir avec la façon dont vous calculez les points à dessiner. 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 toujours dessiner sur une seule ligne diagonale x et y serait toujours le même. Cette représentation graphique ne serait pas approprié dans ce cas, alors.

Qu'en est-il de prendre les N bits de la sortie de RNG et en utilisant 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 hors-champ)
  2. Effectuer une interpolation linéaire pour cartographier l'intervalle de bits à la largeur / hauteur de la fenêtre

Chaque option devrait vous donner une image plus représentative des bits que vous obtenez notre de votre générateur de nombres aléatoires. Bonne chance!

Autres conseils

Votre problème de point de traçage stripy devrait facilement être 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 numéro généré pour x et y est essentiellement l'optimisation prématurée, mais si vous ne descendez cette route, assurez-vous d'extraire différents bits pour chacun du nombre; tout comme, x=n%width;y=n%height vous donne une corrélation énorme entre x et y, comme on peut le voir dans vos images.

Je l'ai utilisé diverses implémentations Mersenne Twister C ++ depuis des années (plus récemment boost 's) pour générer aléatoire et n'a eu aucune difficulté avec elle (graines liées ou non). Il est vraiment un superbe générateur.

Vrai aléatoire génération de nombres ne peut pas être fait avec une fonction mathématique. S'il est important d'avoir un nombre vraiment au hasard, obtenir un générateur de nombres aléatoires . J'ai développé l'argent réel en ligne poker jeux ce matériel est la seule façon d'être sûr qu'il n'y a pas des modèles dans les chiffres.

Si le ciblage d'un environnement Linux, le / dev / random et / dev / urandom pseudo périphériques faire beaucoup mieux qu'un générateur mathématique, car ils intègrent des nombres aléatoires représentant l'activité matérielle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top