rand(n)
返回0
和n
之間的數字。將rand
按預期工作,關於「隨機性」,對於我的平臺上的整數限制的所有參數?Perl的rand的參數有多大?
回答
這將取決於你的randbits
值:
蘭特呼叫您的系統的隨機數發生器(或任何一個被 編譯到你的Perl的複印件)。在本次討論中,我將調用發生器RAND 將它與rand,rand的函數區分開來。蘭德產生 一個從0到2的整數** randbits - 1(含1),其中randbits是一個整數小的 整數。要查看它在perl中的含義,請使用命令'perl -V:randbits'。常用值爲15,16或31.
當您使用參數arg調用rand時,perl將該值作爲 整數並計算該值。
arg * RAND rand(arg) = --------------- 2**randbits
該值將始終落在要求的範圍內。
0 <= rand(arg) < arg
但隨着ARG相比變大到2 ** randbits,事情變得 問題。讓我們想象一下randbits = 15的機器,所以RAND的範圍從0到32767不等,爲 。也就是說,無論何時我們調用RAND,我們都會得到32768 個可能的值之一。因此,當我們調用rand(arg)時,我們得到可能的值之一32768。
它取決於系統(僞)隨機數發生器使用的位數。您可以通過
use Config;
my $randbits = $Config{randbits};
rand
發現通過
perl -V:randbits
或程序中的這個值可以產生2^randbits不同的隨機數。雖然可以生成大於2^randbits的數字,但當N> 2^randbits時,無法生成範圍[0,N)中的所有整數值。
由於(整數截尾)隨機值的分佈不會很平坦,因此N的值不是2的冪也是有問題的。有些價值觀略有過度表現,有些則略低。
值得注意的是,randbits在Windows上是微不足道的15。這意味着你只能得到32768(2 ** 15)不同的值。您可以通過多次調用rand
以及組合所述值改善情況:
use Config;
use constant RANDBITS => $Config{randbits};
use constant RAND_MAX => 2**RANDBITS;
sub double_rand {
my $max = shift || 1;
my $iv =
int rand(RAND_MAX) << RANDBITS
| int rand(RAND_MAX);
return $max * ($iv/2**(2*RANDBITS));
}
假設randbits = 15,double_rand
模仿randbits = 30,提供1073741824(2 ** 30)可能的不同的值。這減輕了(但不能消除)上述兩個問題。
我們在談論大隨機整數以及是否有可能獲得它們。應該指出,兩個隨機整數的連接也是一個隨機整數。所以,如果你的系統,以任何理由,都無法超越999999999999,然後只寫
$bigrand = int(rand(999999999999)).int(rand(999999999999));
,你會得到(最大)的兩倍長度的隨機整數。
(其實這不是一個數字問題的回答「一蘭特數量有多大」,而是回答「你可以得到你想要的,只是串聯小的數字爲大」。)
歡迎使用Stack Overflow。兩個現有答案中的一個答案涵蓋了你所建議的答案,並且答案覆蓋得更好。如果你打算使用你的技術,你需要確保數字的第二部分前綴足夠的零。您在示例中選擇了12位數字,這可能會導致一些問題; 9位數字會更安全。您可能需要使用'sprintf(「%d%09d」,rand(999_999_999),rand(999_999_999))'來生成字符串。即使這可能在Windows上有問題;查看其他答案爲什麼。 – 2012-09-22 19:25:36
- 1. stdlib.h的rand有多糟?
- 2. C中的rand()有多獨特?
- 3. Perl:函數沒有足夠的參數
- 4. - 在函數參數的perl
- 5. php rand函數有問題
- 6. RSpec的測試`rand`內`rand`
- 7. perl +參數
- 8. Perl的輸入參數
- 9. 如何從c函數中獲取較大的隨機數rand()
- 10. 具有多個參數的方法的大O分析
- 11. 的.htaccess有多個參數
- 12. 當參數是數組時,參數的大小是多少?
- 13. 多值參數中的大量值
- 14. bash [:太多的參數大於符號
- 15. 強大的參數需要多個
- 16. 使用Rand()填充多維數組
- 17. MySQL的rand()函數BY
- 18. rand函數值
- 19. PHP .rand函數,
- 20. PHP rand()函數
- 21. Python - 最好有多種方法或大量的可選參數?
- 22. Ruby:Random#rand和Kernel#rand之間的區別rand
- 23. RAND的多行替代方法()
- 24. 多行不同的rand()值SQL Server
- 25. 加入參數 - Perl
- 26. 在perl中沒有參數分割
- 27. rand中rand的工作原理
- 28. 多維數組的Perl
- 29. MySQL的RAND()LIMIT
- 30. rand()的性能
更多信息,我發現這個有趣:http://wellington.pm.org/archive/200704/randomness/index.html – vol7ron 2011-05-13 14:52:03