12
votes

Quelle est la fiabilité de la fonction aléatoire dans Delphi

J'écris un programme qui rédige des tests statistiques à Delphes (doit être Delphi) et j'ai entendu dire que la fonctionnalité aléatoire est quelque peu étrangère. Vous devez appeler Randomize pour randomiser la graine de la fonction aléatoire lorsque le programme commence.

Je me demande si la fonction aléatoire (après avoir appelé Randomize) est suffisamment aléatoire pour des tests statistiques ou une mersenne twister est nécessaire? Est-ce que quelqu'un a un aperçu de la mise en œuvre réelle du hasard qui peut me dire à quel point cela est important?


3 commentaires

Avoir à semer une fonction de randomizer n'est pas du tout rare - vous devez faire la même chose avec une twister Mersenne.


Et la possibilité de semer une fonction aléatoire, il est souvent un excellent avantage. En utilisant la même graine, vous pouvez dupliquer vos résultats, ce qui peut être de grande aide, par exemple lors du débogage.


Il existe une excellente discussion sur ce sujet au chapitre 6 du livre de Julian Bucknall "Tomes of Delphi: algorithmes et structures de données" (www.boyet.com)


9 Réponses :


4
votes

Sauf si vous achetez du matériel relativement ésotérique, la meilleure approximation des nombres aléatoires qu'un ordinateur peut fournir est une séquence pseudo-persistante complètement déterministe. En général, la fonction Randomize utilise une valeur relativement aléatoire (souvent basée sur le temps, mais parfois sur les mouvements de la souris - je n'ai aucune idée de ce que Delphi fait) comme une graine qui fournit le point d'entrée à la séquence de pseudorandom. Sans cela, vous finirez par récupérer 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 de la fiabilité, mais cela devrait vous donner une certaine confiance qui vous oblige à appeler Randomize est un signe d'un bon générateur plutôt que d'un mauvais. Il existe un tas de tests statistiques qui montrent comment une séquence de nombres aléatoires est aléatoire et il est probable que le générateur de nombres aléatoires Delphi convient à de nombreuses fins, car il s'agit d'un produit mature.


0 commentaires

16
votes

text alt

Je ne pouvais pas résister.


4 commentaires

J'aime l'humour. Mais il doit être cw!


Nah, pas de CW, il illustre parfaitement que ce que nous pouvons percevoir comme non aléatoire, peut être parfaitement aléatoire. Après tout, aléatoire n'est pas l'absence d'un motif ...


À tout moment, vous vous sentez enclin à mettre "Je ne pouvais pas résister à" dans votre "réponse", vous devriez être enclin à le faire cw. C'est une question de degré, mais dans ce cas, il n'y avait pas de réponse directe à l'OP.


Je vais bien avec les gens à voter. Je n'ai pas le pouvoir de faire un wiki communautaire. VOTE UP / DOWN, ça ne vous dérange pas vraiment ... Je n'essaie pas de jouer au système de réputation de Jeu.



20
votes

PRNG de DELPHI, comme presque tous les langages de programmation RTL PRNGS, est un Générateur confortable linéaire . < / p>

C'est assez bon pour la plupart des petites choses, mais il y a des choses à surveiller. En particulier, faites attention aux bits à faible ordre: le modèle de multiplication et d'ajout signifie que les bits à faible ordre ne sont pas très aléatoires du tout. Mais cela ne s'applique généralement qu'aux grandes valeurs 32 bits retirées, puis tronquées avec mod ou similaire. En utilisant aléatoire (10) pour cueillir une valeur comprise entre 0 et 9 utilise en interne une multiplication sur l'ensemble de la plage 32 bits plutôt que d'un fonctionnement mod


0 commentaires

6
votes

Si vous recherchez un moyen de garantir un caractère unique de nombres aléatoires avec l'heure d'exécution la plus rapide, About.com a créé un défi sur générateur de nombres aléatoires uniques le plus rapide et La mise en œuvre de Patrick Van Logchem a été élue comme le gagnant.


0 commentaires

6
votes

Si aléatoire est suffisamment fiable pour que vos tests statistiques dépendent du contexte dans lequel vous avez l'intention de l'utiliser.

Cela dit, j'ai écrit plusieurs morceaux de code Delphi qui doivent faire des statistiques appropriées et avoir utilisé aléatoire par exemple. Pour obtenir diverses distributions NULL, des pseudo-réplications et des resamples de données. Jusqu'à présent, je n'ai pas rencontré aucun cas dans mon propre code où aléatoire aurait donné des résultats biaisés ou peu fiables, ou des résultats qui auraient empêché son utilisation pour le test statistique prévu. Mais ce qui détient 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 vers aléatoire (par exemple dans R, SPSS, etc.) et examiner si la répartition des résultats violent les exigences de distribution pour votre test (s) statistique (s). [Si vous êtes un scientifique approprié, c'est ce que vous devriez faire quand même.]

Si vous avez besoin d'autres PRNG - E.G. Le La bibliothèque TPMath contient quelques-uns. (Pour plus de choses impliquées, il existe également la possibilité d'appeler des fonctions statistiques élaborées de R via Delphi.)


0 commentaires

2
votes

du site Web Embarcadero:

_Lrand est la longue fonction de générateur de nombres aléatoires. _Rand utilise un générateur de nombres aléatoires congruentiels multiplicatifs avec la période 2 ^ 64 pour renvoyer des nombres pseudo-aléatoires successifs compris entre 0 et 2 ^ 31 - 1.

Le générateur est réinitialisé en appelant Srand avec une valeur d'argumentation de 1. Il peut être réglé sur un nouveau point de départ en appelant Srand avec un numéro de graine donné.


0 commentaires

2
votes

S'ils ne modifiaient pas la mise en œuvre depuis que je l'ai analysé (Delphi 4 IIRC), le Delphi PRNG est mis en œuvre comme ceci: xxx

(pseudocode / suppose que les multiplications sont arbitrairement importantes. entiers)


0 commentaires

3
votes

Juste pour ajouter au pool de possibilités - Windows propose une gamme d'intégrés Fonctions de cryptographie . Il y a probablement un wrapper Delphi pour eux également, s'il n'est pas déjà inclus par défaut.

Parmi ces fonctions est également un Cryptographiquement fort aléatoire Générateur de numéro . C'est de loin le meilleur aléatoire que vous obtiendrez dans des logiciels, car il se grose elle-même sur la base d'une très longue liste de facteurs. Je ne suis pas sûr, mais je soupçonne que cela utilisera même un générateur de nombres aléatoires matériels si vous en avez un.

Et si cela ne suffit pas, vous pouvez également essayer de vous inscrire au Service de générateur de bits aléatoire quantique pour certains vraiment valeurs aléatoires.


0 commentaires

-2
votes

Retour aléatoire entre 0..9

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


2 commentaires

L'appel recommandé pour générer un entier aléatoire dans la plage 0 à 9 est "aléatoire (10)" utilisant Floattostr est intelligent, mais l'expression donnée échouera parfois. Envisager: "Randseed: = -1498392781; x: = strtoint (copie (Floattostr (aléatoire), 4,1));" Dans ce cas, aléatoire reviendra exactement 0,5, Floattostr retournera "0,5", car il n'y a pas de quatrième caractère, la copie retournera la chaîne vide et Strtoint échouera avec une exception.


L'idée était de donner l'exemple avec une plus grande dispersion (voir Lien ) .So Vous pouvez améliorer librement cet algorithme en fonction de vos besoins .. .