Comment puis-je déterminer la période de mon générateur de nombres pseudo-aléatoires?

14

Supposons que j'utilise un générateur de nombres pseudo-aléatoires congruents linéaires (PRNG). Étant donné une graine , le facteur multiplicateur (a), le facteur de décalage (c) et le facteur de module (m), comment puis-je déterminer la période de mon PRNG? Est-ce que je le détermine par des algorithmes d'expérimentation / détection de modèle, ou existe-t-il une formule directe pour calculer sa période? X0

Bien que ma question concerne spécifiquement la méthode congruentielle linéaire, je suis ouvert à en savoir plus sur la façon dont les périodes sont calculées dans la pratique pour d'autres PRNG également.

Paul
la source
BTW, si vous utilisez LFSR, la période est maximale si le polynôme de rétroaction est primitif . Dans ce cas, la période AFAIK (ne me citez pas; trop paresseux pour déterrer mes notes de cours) est qn où le polynôme de rétroaction de degré n , et q est la taille de le domaine des coefficients. p(X)Fq[X]nq
2
Les algorithmes de détection de cycle de Floyd ainsi que les algorithmes de détection de cycle de Brent sont deux moyens efficaces de détecter les cycles. Les deux renverront plusieurs L de la période, et une fois que vous avez cela, vous pouvez factoriser L et voir quel est le plus petit facteur qui est une période.
xdavidliu

Réponses:

12

Si vous vous limitez à des cycles LCG PRNG complets, la réponse est simple, par définition, c'est tout simplement m .

Pour trouver la période d'un cycle LCG PRNG non complet pour une graine donnée, il vous suffit de compter le nombre d'itérations du PRNG jusqu'à ce qu'il génère à nouveau la valeur de la graine.

De la page wikipedia référencée :

Durée de la période

La période d'un LCG général est au plus m , et pour certains choix bien inférieure à cela. À condition que c soit différent de zéro, le LCG aura une période complète pour toutes les valeurs de départ si et seulement si :

cmune

Historiquement, de mauvais choix avaient conduit à des mises en œuvre inefficaces des LCG. Un exemple particulièrement illustratif de ceci est RANDU qui a été largement utilisé au début des années 1970 et conduit à de nombreux résultats qui sont actuellement remis en question en raison de l'utilisation de ce pauvre LCG.

Pourquoi vous souhaitez utiliser un générateur à cycle complet

Si vous ne vous limitez pas aux PRNG LCG à cycle complet, vous prenez un risque énorme .

Si vous ne savez pas qu'un LCG donné est un cycle complet, vous pouvez vous retrouver avec un générateur avec un nombre arbitraire de séquences mutuellement distinctes, dont certaines pourraient être embarrassantes et avoir un caractère aléatoire épouvantable, peut-être même pire que le fameux générateur RANDU .

Vous ne voulez vraiment pas avoir à vérifier chaque valeur de graine possible pour vous assurer qu'elle génère une séquence suffisamment longue pour votre application.

Lectures complémentaires

Pour une excellente introduction aux générateurs de nombres pseudo-aléatoires, je vous recommande fortement de lire le chapitre Recettes numériques sur les nombres aléatoires.

Mark Booth
la source
C'est vrai, mais je ne me limite pas aux LCG PRNG à pleine période ... Je suis curieux des mauvais choix de a, c et m, tels que les flux aléatoires qui n'atteignent pas la période complète. J'aimerais pouvoir savoir à l'avance, étant donné certains a, c et m, quelle sera la période inévitablement. Je sais qu'elle est délimitée par m, mais je me demandais si nous pouvions faire mieux que cela et obtenir la période exacte.
Paul
Je ne pense pas que cela divise les cheveux sur une technicité du tout: la question était "comment déterminer la période d'un LCG avec des paramètres arbitraires", alors que cette réponse dit "n'utilisez pas de LCG arbitraires, utilisez toujours des LCG de période complète, et en supposant que vous le fassiez , la réponse à votre question serait la période maximale possible, par définition ". L'argument en faveur de l'utilisation des LCF sur une période complète présenté dans cette réponse est parfaitement convaincant, mais le problème est que ce n'est pas du tout la question posée.
xdavidliu
Désolé @xdavidliu mais je ne vois pas en quoi votre nouveau commentaire m'aide à améliorer ma réponse. Vous avez attiré mon attention sur le fait que je n'ai pas vraiment répondu à la question, j'ai édité ma réponse pour y remédier, puis je vous ai fait savoir d'une manière qui pourrait vous faire sourire (si vous êtes un fan de Futurama). Je ne pense pas que quelque chose de plus doive être dit.
Mark Booth
Notez que sur l'échange de pile, les commentaires ne sont pas destinés à des discussions approfondies, car ils utilisent Computational Science Chat . Les commentaires aident à améliorer les questions et les réponses et sont distrayants, nous essayons donc de les réduire au minimum. Les commentaires doivent être considérés comme éphémères, tout commentaire qui n'aide plus activement à améliorer une question ou une réponse peut être supprimé à tout moment pour ranger un message.
Mark Booth