2010-05-20 16 views
7

J'ai besoin d'un bon générateur de nombres pseudo-aléatoires qui peut être calculé comme une fonction pure à partir de sa sortie précédente sans cacher d'état. Sous « bonne » Je veux dire:Y a-t-il de "bonnes" valeurs de génération PRNG sans état caché?

  1. Je dois être en mesure de paramètrer générateur de telle sorte qu'il en cours d'exécution pour 2^n itérations avec tous les paramètres (ou avec une grande partie d'entre eux) devrait couvrir la totalité ou la quasi-totalité des valeurs entre 0 et 2^n - 1, où n est le nombre de bits dans la valeur de sortie.

  2. sortie du générateur combiné de n + p de bits doit couvrir la totalité ou la quasi-totalité des valeurs comprises entre 0 et 2^(n + p) - 1 si je l'exécuter pour 2^n itérations pour toutes les combinaisons possibles de ses paramètres, où p est le nombre de bits dans les paramètres.

Par exemple, LCG peut être calculé comme une fonction pure et il peut répondre à la première condition, mais il ne peut pas répondre à une seconde. Disons, nous avons LCG 32 bits, m = 2^32 et il est constant, notre p = 64 (deux paramètres 32 bits a et c), n + p = 96, donc nous devons jeter un coup d'oeil sur les données par trois ints de sortie pour répondre à la deuxième condition. Malheureusement, la condition ne peut pas être satisfaite à cause d'une séquence strictement alternée d'impairs et d'impairs en sortie. Pour surmonter cela, l'état caché doit être introduit, mais cela rend la fonction non pure et brise la première condition (longue période cachée).

EDIT: à proprement parler, je veux la famille des fonctions paramétrées par p bits, et avec la manière l'état complet de n bits générant chacun toutes les chaînes binaires possibles de p + n bits uniques « randomish », non seulement incrémenter en continu (p + n) - bit int. Paramétrisation nécessaire pour sélectionner cette façon unique.

Est-ce que je veux trop?

+0

Vous voulez qu'un générateur de nombres aléatoires génère une séquence presque distincte? –

+0

@Moron, oui. Le générateur devrait être capable de générer toutes ou presque toutes les séquences de bits distinctes possibles de longueur prédéfinie L en plusieurs passages avec des paramètres différents ne faisant pas plus de 2^n itérations pour chaque cycle, où n actual

+2

Si vous attendez k nombres distincts dans k appels, ce n'est pas aléatoire du tout. Par exemple Je peux toujours prédire le dernier! Ou ai-je mal compris? –

Répondre

1

Essayez LFSR
Tout ce dont vous avez besoin est la liste des polynômes primitifs.
Période de génération de champ fini de cette manière, génère un champ de taille 2^n-1. Mais vous pouvez généraliser cette procédure pour générer quelque chose avec une période de k^n-1.

Je ne l'ai pas vu cette mise en œuvre, mais tout ce que vous devez mettre en œuvre Croître est un nombre par petit nombre s> n où GCD (s, 2^n-1) == 1. GCD est synonyme de plus grand diviseur commun

+0

Si je comprends bien, il y a un sous-ensemble de valeurs combinées contenant des zéros qui ne peuvent pas être générés. – actual

+0

C'est vrai. Vous devez ajouter manuellement le support pour les zéros si vous en avez besoin et juste passer de la valeur prédéfinie par exemple 0x001 à 0x000 et ensuite revenir à la valeur suivante de 0x001. –

2

Vous pouvez utiliser n'importe quel chiffrement par bloc, avec une clé fixe. Pour générer le numéro suivant, déchiffrez le numéro actuel, incrémentez-le et re-cryptez-le. Comme les chiffrements de bloc sont à 1: 1, ils parcourront nécessairement tous les nombres du domaine de sortie avant de les répéter.

+0

Idée intéressante, mais trop lente pour mon application. En tout cas, merci. – actual

+0

Hmm ... peut-être pas si lent. Comment pensez-vous que cela fonctionnera, si je vais générer une clé de largeur p, pas n + p, et commencer XOR avec des données de largeur n + p. Générera-t-il toutes les combinaisons de largeur n + p? – actual

+0

Dépend de l'endroit où vous obtenez les données. De manière générale, cela ne générera probablement pas de permutation. –