2010-07-08 5 views

Répondre

5

Divide rand() par la numer aléatoire maximale, il faut multiplier par la plage et ajoutez le numéro de départ:

<?php 
    // rand()/getrandmax() gives a float number between 0 and 1 
    // if you multiply it by 0.002 you'll get a number between 0 and 0.002 
    // add the starting number -0.001 and you'll get a number between -0.001 and 0.001 

    echo rand()/getrandmax()*0.002-0.001; 
?> 
+0

Salut Harmen, je ne sais pas quelle est la raison de ma formule, j'ai trouvé un bug là-bas. il a généré une valeur de -ve 2.plus .. vous avez une idée? merci – davidlee

+0

Je suppose que vous avez trouvé un nombre proche de zéro, comme '-4.7090060121464E-5'. Cela signifie '-4.7 * 10^-5' qui est' -0.000047' – Harmen

3

.

$val = (rand(0,20)-10)/10000; 
+0

Maintenant vous avez vraiment limité à 21 valeurs possibles. Mais peut-être que c'est ce que Benmsia veut ... – VolkerK

+0

ouais. THX. Plus les valeurs générées seront meilleures, mais s'il n'y a pas de solution valide, je m'en tiendrai à cela temporairement jusqu'à ce qu'une nouvelle solution soit trouvée. merci Nathan. – davidlee

0

Cela renverra tout possible nombre entre -0.001 et +0.001

$random = ((rand()*(0.002/getrandmax()))-0.001) 
// or without paranthesis: 
$random = rand()*0.002/getrandmax()-0.001 
+0

Vous n'avez pas besoin de toutes ces parenthèses. – Harmen

+2

Oui, bien sûr, mais ils ne font pas mal non plus – jigfox

+0

Salut merci pour votre contribution. mais il a généré une valeur -ve 2.plus pour une raison inconnue. tu as une idée? – davidlee

0
$randselect=rand(0,(array_sum($adarray)*100000000)); 
$cumilativevalue=0; 
foreach ($adarray as $key => $value) { 
$cumilativevalue=$cumilativevalue+$value*100000000; 
    if($randselect<$cumilativevalue){$selectedad=$key;break;} 
} 
1

Cela utilise deux appels de rand() mais je pense que la lisibilité le décuple. La première partie fait soit -1 soit +1. La deuxième partie peut être n'importe quoi entre 0 et votre limite pour les nombres +/-.

$rand = (rand(0,1)*2-1)*rand(0, 100); 
echo $rand; 

À moins que vous avez besoin d'un bon nombre de nombres aléatoires dans une boucle gigantesque, vous aurez probablement même pas remarqué la différence de vitesse. J'ai couru quelques tests (50.000 itérations) et il est arrivé environ 0.0004 millisecondes pour obtenir un nombre aléatoire par ma fonction. Les alternatives sont environ la moitié de ce temps, mais encore une fois, sauf si vous êtes dans une très grande boucle, vous êtes probablement mieux d'optimiser ailleurs.

code de test de vitesse:

$start = microtime(); 
$loopCount = 50000; 
for($i=0;$i<$loopCount;$i++) 
{ 
    (0*2-1)*rand(0, 100); 
} 
$end = microtime(); 

echo "Timing: ", ((($end-$start)*1000.0)/((float)$loopCount)), " milliseconds."; 
Questions connexes