2012-09-14 27 views
0

我需要生成用於訪問我的網站的人的僞隨機代碼。我寫了一些代碼來允許這樣做,但沒有意識到我使用字符數組而不是整數作爲種子(以使mt_rand可重複)。我的演示代碼是在這裏:mt_rand使用字符作爲種子

$seedVal = array(6565866669, 6565866670, 6565866671); 


foreach ($seedVal as $seed) { 
    mt_srand($seed); 
    $rnd = ''; 
    for ($i = 0; $i < 11; $i++) { // Loop over the string length 
     $tmp = mt_rand(0, 10); 
     $rnd .= $tmp; 
    } 

    echo "Seed = $seed, RandNum = $rnd </br>"; 
} 

echo "</br>Now with character seeds</br>"; 

$seedVal = array('6565866669', '6565866670', '6565866671'); 

foreach ($seedVal as $seed) { 
    mt_srand($seed); 
    $rnd = ''; 
    for ($i = 0; $i < 11; $i++) { // Loop over the string length 
     $tmp = mt_rand(0, 10); 
     $rnd .= $tmp; 
    } 

    echo "Seed = $seed, RandNum = $rnd </br>"; 
} 

return; 

上的1and1結果是:

Seed = 6565866669, RandNum = 425453109319 
Seed = 6565866670, RandNum = 39388593858 
Seed = 6565866671, RandNum = 891273965110 

Now with character seeds 
Seed = 6565866669, RandNum = 97138956767 
Seed = 6565866670, RandNum = 97138956767 
Seed = 6565866671, RandNum = 97138956767 

但在其他地方,結果(本地主機,其他服務器等):

Seed = 6565866669, RandNum = 425453109319 
Seed = 6565866670, RandNum = 39388593858 
Seed = 6565866671, RandNum = 891273965110 

Now with character seeds 
Seed = 6565866669, RandNum = 425453109319 
Seed = 6565866670, RandNum = 39388593858 
Seed = 6565866671, RandNum = 891273965110 

問題是在我現在的服務器上(1and1)系統工作正常(使用不可預測的字符輸入)。但是我正在遷移到一臺新的服務器上,當然,這些代碼看起來像是第一套。換句話說,我不知道如何生成第二組隨機數(使用字符數組播種)。

誰能告訴我如何做到這一點?

我想:

mt_srand('6565866669'); 
echo mt_rand(0, 10); 

返回

97138956767 

掙扎。謝謝!!

+0

它們是字符串,它應該沒問題,因爲PHP會隱式地將它們轉換爲整數。運行新服務器的是哪個版本的php? (調用'php_info()'或者在命令行上運行'php -v')。 –

+0

1and1使用PHP版本5.2.17。我的本地主機是PHP版本5.4.4 – zbinsd

+2

任何機會是新的服務器32位,而舊的64位? –

回答

3

(感謝therefromhere已精確定位的問題:你有32位和64位服務器Acccept他的回答,如果他的職位了。)

這是你的問題:

  1. mt_srand()需要一個整數參數
  2. PHP會(幫助)嘗試將參數強制轉換爲整數如果參數需要
  3. 64位系統上的最大整數是4.something gazillion - 因此您的字符串將轉換爲整數,但在32位系統上,最大整數是21億,所以你的字符串將轉換爲一個不同的整數與允許的範圍(它達到21億美元,然後包裝到-2億美元,並重復計數)。

解決方案來處理big_ints是使用GMP或bcmath時庫,但這些不會在這種情況下,在mt_srand()工作取整數 - 所以你-2.1十億和+2.1之間侷限於號碼十億,或者在您的Web服務器上安裝64位OS/Apache/PHP。

+0

我會讓你拿着信用:) –

+0

優秀的答案。對此,我真的非常感激。 – zbinsd