2009-12-19 19 views
0

J'essaie de prédire la sortie d'un programme qui utilise la fonction rand() de msvcrt pour générer la face de trois dés. Je crois que le code est quelque chose comme: dice[0] = rand() % 6 + 1; dice[1] = rand() % 6 + 1; dice[2] = rand() % 6 + 1;, et je me demandais si je pouvais utiliser un programme de prédiction pour les générateurs linéaires congruents pour prédire les nombres suivants dans la séquence.msvcrt.dll utilise-t-il un générateur congruentiel linéaire pour sa fonction rand()?

+0

Vous pouvez vider le bit correspondant de la DLL et regarder le code du générateur vous-même. –

+1

Pourquoi? Vous avez accès au code source - il s'agit de deux lignes. –

+0

Je devrais creuser ce genre de choses plus souvent. Je n'ai même pas réalisé que c'était là. –

Répondre

3

Voyez vous-même: C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\rand.c

(Ou utilisez %VCINSTALLDIR%\crt\src\rand.c si vous exécutez à partir d'une invite de commande VC.)

(En supposant que vous avez au moins la version standard de VC Il est deux lignes. Je le poste, mais je ne sais pas si la licence le permet.)

+2

% VCINSTALLDIR% \ crt \ src \ rand.c est plus général. – codekaizen

+0

En effet, merci. –

+0

Merci, c'est exactement ce dont j'avais besoin. Je suis allé à travers tout cela juste pour trouver que le programme que j'essaie de prédire ne fonctionne pas comme je l'ai prédit (il appelle rand() dans diverses autres parties du programme, foutant ma graine). –

1

Si la mémoire est bonne, oui c'est un générateur linéaire congruentiel - mais ce qu'il retourne est le reste d'une plus grande sortie, ce qui augmente la difficulté de prédire le prochain numéro (au point t vous avez probablement besoin d'un échantillon beaucoup plus grand que trois sorties pour le faire de manière fiable).