2010-07-08 179 views

回答

5

返回任何可能數,由範圍相乘,並添加起始編號:

<?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

嗨哈門,不知道是什麼原因你的公式我發現了一個錯誤。它產生了一個-ve 2.plus值..你有什麼想法嗎?謝謝 – davidlee 2010-07-08 19:01:40

+0

我猜你發現一個接近於零的數字,比如'-4.7090060121464E-5'。它意味着'-4.7 * 10^-5'這是'-0.000047' – Harmen 2010-07-08 19:07:33

3

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

現在你真的限於21個可能的值。但也許這就是benmsia想要的...... – VolkerK 2010-07-08 18:20:33

+0

是的。謝謝。生成更多的值會更好,但如果沒有有效的解決方案,那麼我會暫時堅持下去,直到找到新的解決方案。謝謝納坦。 – davidlee 2010-07-08 19:07:28

0

這將最大隨機NUMER -0.001+0.001鴻溝rand()之間

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

您不需要所有這些括號。 – Harmen 2010-07-08 18:17:08

+2

是的,但他們不傷害 – jigfox 2010-07-08 18:18:57

+0

嗨,謝謝你的意見。但由於未知原因它產生了-ve 2.plus值。你有什麼想法? – davidlee 2010-07-08 19:04:29

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

這使用了兩個rand()調用,但我認爲可讀性彌補了它的十倍。 第一部分是-1或+1。第二部分可以是0和+/-數字的限制之間的任何值。

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

除非在一個巨大的循環中需要大量的隨機數,否則您甚至不會注意到速度差異。我運行了一些測試(50.000次迭代),並通過我的函數獲得了一個隨機數大約0.0004毫秒。替代品大約有一半的時間,但是,除非你處於一個非常大的循環中,否則你可能更適合在其他地方進行優化。

速度測試代碼:

$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.";