2015-05-17 54 views
4

我有一個問題,這個功能一直是我的mt_rand()給我同樣的號碼:mt_rand()給我總是相同數量的

$hex = 'f12a218a7dd76fb5924f5deb1ef75a889eba4724e55e6568cf30be634706bd4c'; // i edit this string for each request 
$hex = hexdec($hex);  
mt_srand($hex); 
$hex = sprintf("%04d", mt_rand('0','9999')); 

$hex總是改變,但結果總是相同的4488

編輯

$hex = str_split($hex); 
$hex = implode("", array_slice($hex, 0, 7)); 
mt_srand($hex); 
$number = sprintf("%04d", mt_rand('0','9999')); 

http://php.net/manual/en/function.mt-srand.php

+1

是你的實際代碼上面的代碼片段?你可以請張貼一大部分嗎? – Timo

+1

我懷疑你的$十六進制值是高於''mt_getrandmax()''mt_srand''也是一個整數(可能會截斷你的輸入爲int) – fbas

+0

@TimoSta它的代碼與問題@fbas我測試過' substr($ hex,0,10)'但它不工作很多時候我有相同的號碼 – p4c

回答

5

你的問題是,你總是在你的變量$hex浮點值結束。而功能mt_srand(),你也可以看到在manual

無效mt_srand([INT $種子])

要求整。所以它只是試圖將你的浮點值轉換爲一個整數。但由於此操作失敗,它會永遠返回0

所以在最後你總是結束與種子0,然後又用相同的「隨機」數。

你可以看到這一點,如果你這樣做:

var_dump($hex); 

輸出:

float(1.0908183557664E+77) 

如果你再想看哪個整數它會結束,如果它被轉換,你可以使用這個:

var_dump((int)$hex); 

你會看到它永遠是0


此外,如果你有興趣,爲什麼你的電話號碼爲float結束,它只是因爲整數溢出的,因爲你的號碼是太大了,並accoding到manual

如果PHP遇到許多超出了integer的邊界,它將被解釋爲float代替。此外,導致超出整數類型範圍的數字的操作將返回一個float。

如果你這樣做:

echo PHP_INT_MAX; 

您將獲得爲int的最大值,這將是:

28192147483647  //32 bit 
9223372036854775807 //64 bit 

編輯:

所以現在如何解決這個問題,仍然確保獲得一個隨機數字?

那麼第一個想法可能只是檢查值是否大於PHP_INT_MAX,如果是將其設置爲其他數字。但我認爲,看起來你總是會有這麼大的十六進制數。

因此,我建議你這樣的事情:

$arr = str_split($hex); 
shuffle($arr); 
$hex = implode("", array_slice($arr, 0, 7)); 

在這裏,我只是str_split()分割你的電話號碼到一個數組,到隨後shuffle()陣列,這之後我implode()第7個數組元素,我得到與array_slice()

完成此操作後,您可以將其與hexdec()一起使用,然後在mt_srand()中使用它。

另外爲什麼我只能得到前7個元素?只是因爲我可以確保我沒有達到PHP_INT_MAX的值。

+0

對於'PHP_INT_MAX'我有'2147483647'但我在本地主機我測試'(int)$ hex'它的工作一次/ 3什麼是好的解決方案substr或int? – p4c

+0

@ p4c使用解決方法/解決方案更新了我的答案。 – Rizier123

+0

謝謝你Rizier它的工作很棒我更新了我的第一篇文章,但我沒有使用隨機播放,因爲我總是需要使用相同字符串的相同結果 – p4c