簡體   English   中英

mt_rand()給了我相同的數字

[英]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'));

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

您的問題是,您總是在變量$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM