2010-11-13 7 views
1

Je veux produire un nombre naturel (un entier positif entre 0 et x) en utilisant lcg_value(). Voilà ce que je peux voir à partir du code source de la fonction:Générer un nombre naturel de PHP lcg_value()?

/* 
* combinedLCG() returns a pseudo random number in the range of (0, 1). 
* The function combines two CGs with periods of 
* 2^31 - 85 and 2^31 - 249. The period of this function 
* is equal to the product of both primes. 
*/ 

Maintenant, comment pourrais-je transformer ce flotteur dans un nombre naturel de sorte que je ne perde pas d'informations/entropie. Actuellement, je le fais juste comme ceci:

$number = pow(2,31) * lcg_value(); 

Cependant, j'ai le sentiment dans mon intestin que ce n'est pas parfait. Que diriez-vous de 2^62? Ou peut-être 2^31-334? Ou 2^62-334? Je ne sais pas.

+1

Pourquoi diviser, multiplier non? – kennytm

+0

Désolé, c'était une faute de frappe. :) – Tower

+0

Comment 334 s'applique-t-il à cette situation? – poke

Répondre

1

soit de type float ou int sont délimitées par la plate-forme

entier La taille d'un entier est dépendant de la plate-forme, bien qu'une valeur maximale d'environ deux milliards est la valeur habituelle (ce qui est 32 bits signé). Les plates-formes 64 bits ont généralement une valeur maximale d'environ 9E18. PHP ne supporte pas les entiers non signés. La taille de l'entier peut être déterminée en utilisant la constante PHP_INT_SIZE, et la valeur maximale en utilisant la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5. La taille d'un flottant dépend de la plate-forme, bien qu'un maximum de ~ 1.8e308 avec une précision d'environ 14 chiffres décimaux soit une valeur commune (le format IEEE 64 bits).

pour maintenir la plus haute précision du flotteur, u peut se référer http://www.php.net/manual/en/function.bcmul.php