[英]mt_rand() gives me always the same number
我有這個函數的問題總是我的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'));
您的問題是,您總是在變量$hex
使用浮點值。 你可以在手冊中看到函數mt_srand()
:
void mt_srand([ int $ seed])
期待一個整數。 它的作用是,它只是嘗試將您的浮點值轉換為整數。 但由於失敗,它將始終返回0。
所以最后你總是得到種子0然后也有相同的“隨機”數字。
如果你這樣做,你可以看到這個:
var_dump($hex);
輸出:
float(1.0908183557664E+77)
如果你想看看哪個整數最終會轉換,你可以使用:
var_dump((int)$hex);
你會發現它總是0。
此外,如果你感興趣,為什么你的數字最終為浮動,這只是因為整數溢出,因為你的數字太大而且符合手冊 :
如果PHP遇到超出整數類型邊界的數字,它將被解釋為浮點數 。 此外,導致超出整數類型邊界的數字的操作將返回浮點數。
如果你這樣做:
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值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.