Question

Je suis en train d'écrire un programme qui écrire des tests statistiques dans Delphi (Delphi doit être) et je l'ai entendu dire que la fonctionnalité aléatoire est un peu bizarre. Vous devez appeler randomize randomiser la graine de la fonction aléatoire lorsque le programme démarre.

Je me demande si la fonction aléatoire (après avoir appelé randomize) est assez aléatoire pour les tests statistiques ou un Mersenne Twister est nécessaire? Quelqu'un at-il aperçu de la mise en œuvre réelle de hasard qui peut me dire comment est-ce important?

Était-ce utile?

La solution

Que Random est suffisamment fiable pour vos tests statistiques dépendront du contexte dans lequel vous avez l'intention de l'utiliser.

Cela dit, je l'ai écrit plusieurs morceaux de code Delphi qui doivent faire des statistiques appropriées et ont utilisé Random par exemple pour obtenir diverses distributions nulles, les données de pseudo-répétitions et rééchantillonnages. Jusqu'à présent, je ne suis pas venu dans tous les cas dans mon code où Random aurait donné des résultats biaisés ou peu fiables, ou les résultats qui auraient empêché son utilisation pour le test statistique destiné. Mais ce qui vaut pour mon code ne doit pas nécessairement tenir pour le vôtre.

En cas de doute, vous pouvez bien sûr analyser statistiquement les résultats des appels à Random (par exemple dans R, SPSS, etc.) et vérifier si la distribution des résultats violent les exigences distributifs pour votre test statistique particulier (s). [Si vous êtes un scientifique approprié, c'est ce que vous devriez faire de toute façon.]

Si vous avez besoin d'autres PRNGs - par exemple la bibliothèque TPMath contient quelques-uns. (Pour les choses plus impliqués, il y a aussi la possibilité d'appeler des fonctions statistiques élaborées à partir de R via Delphi.)

Autres conseils

PRNG de Delphi, comme presque tous les langages de programmation RTL PRNGs, est un linéaire générateur de congruence .

Il est assez bon pour la plupart des choses à petite échelle, mais il y a des choses à surveiller. En particulier, attention aux bits de poids faible: le modèle de multiplication et d'ajouter des moyens que bits de poids faible ne sont pas très aléatoire du tout. Mais cela vaut généralement que pour les grandes valeurs 32 bits a sorti puis tronqué avec mod ou similaire. Utilisation de Random(10) pour cueillir une valeur comprise entre 0 et 9 utilise en interne une multiplication sur toute la plage de 32 bits au lieu d'une opération de mod.

text alt

Je ne pouvais pas résister.

Si vous cherchez un moyen d'unicité de garantie de nombres aléatoires avec le temps d'exécution plus rapide, About.com a créé un défi le plus rapide de nombre aléatoire unique générateur et la mise en œuvre de Patrick van Logchem a été élu gagnant.

Sauf si vous achetez un peu de matériel relativement ésotérique, la meilleure approximation des nombres aléatoires d'un ordinateur peut fournir est une séquence pseudo-aléatoire complètement déterministe. En général, la fonction Randomize utilise une valeur relativement aléatoire (souvent en fonction du temps, mais parfois sur les mouvements de la souris - je ne sais pas ce que Delphi fait) comme une graine qui constitue le point d'entrée à la séquence pseudo-aléatoire. Sans cela, vous finirez par revenir le même ensemble de nombres aléatoires dans le même ordre chaque fois, ce qui tend à vaincre le but d'utiliser des nombres aléatoires en premier lieu.

D'accord, je me rends compte que cela ne répond pas à la question sur la fiabilité, mais il devrait vous donner une certaine confiance que vous obliger à appeler est randomisez signe d'un bon générateur plutôt que d'un mauvais. Il y a un tas de tests statistiques qui montrent comment aléatoire une séquence de nombres est, et il est probable que le générateur de nombres aléatoires Delphi convient à de nombreuses fins comme il est un produit mature.

Juste pour ajouter à la piscine des possibilités - Windows offre une gamme de haut- fonctions cryptographie . Il y a probablement une enveloppe Delphi pour eux aussi, si elle est pas déjà inclus par défaut.

Parmi ces fonctions est également cryptographiquement forte aléatoire générateur nombre . Ceci est de loin le meilleur aléatoire, vous obtiendrez dans le logiciel, car il repose sur les semences se une très longue liste de facteurs. Je ne suis pas sûr, mais je pense qu'il va même utiliser un générateur de nombres aléatoires de matériel si vous en avez un.

Et si cela ne suffit pas, vous pouvez aussi vous inscrire au Quantum aléatoire Bit service Générateur certains vraiment des valeurs aléatoires.

À partir du site Web Embarcadero:

_lrand est le nombre aléatoire à long fonction de générateur. _rand utilise un générateur de nombre aléatoire multiplicative congruence avec la période 2 ^ 64 pour retourner des nombres pseudo-aléatoires successives dans l'intervalle de 0 à 2 ^ 31 - 1.

Le générateur est réinitialisé en appelant srand avec une valeur d'argument de 1. Il peut être réglé à un nouveau point de départ en appelant srand avec un certain nombre de semences donné.

Si elles ne changent pas la mise en œuvre depuis que je l'analysais (Delphi 4 IIRC), Delphi PRNG est mis en œuvre comme ceci:

Randseed:=int32(Randseed*$08088405)+1
result:=Randseed*Range shr 32

(pseudocode / assumer les multiplications sont arbitrairement sur de grands entiers)

aléatoire retour entre 0..9

StrToInt(copy(FloatToStr(Random),4,1))

Remarque: Vérifiez la longueur FloatToStr (aléatoire) avant d'utiliser ou d'utiliser un autre chiffre de la partie décimale ...

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