[英]Why is the range of rand() smaller than that of int?
我正在嘗試用5000個隨機數填充向量。 每個數字都是整數。 但是我想知道為什么rand()只給出正整數,為什么它從不給出整數可以容納的最大值。 有什么理由嗎?
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
unsigned seed = time(0);
srand(seed);
vector<int> vect(5000);
for (int i = 0; i < vect.size(); i++)
{
vect[i] = rand();
}
return 0;
}
這是rand()
作用:
返回介於
0
和RAND_MAX
之間的偽隨機整數值(包括0
和RAND_MAX
)。
RAND_MAX
是實現定義的,但將為“至少32767”。
除了“這是如何指定”之外沒有其他“為什么”。
如果要包含一個負數的范圍,則可以應用一些數學運算(例如,減法)。
注意事項:
不建議將
rand()
用於嚴重的隨機數生成需求。 建議使用C ++ 11的隨機數生成工具來替換rand()
。 (自C ++ 11起)
所述設施為您提供了更好的控制和更好的分配( 示例 )。
為什么你沒有得到完整的可能范圍的原因是rand()
是古。
早在rand()
開發時,實現隨機數生成器的常用方法就是所謂的線性同余生成器(lcg)。 這不會給出非常隨機的數字。 實際上,如果您看過前幾個,它們是可以預見的。 但是,當時的計算機運行緩慢,只能處理少量數據。
這就是rand()
僅承諾15位的原因-常量RAND_MAX
定義了您可以從RAND
獲得的最大值,並且該值可以低至32767
。 那時的32位計算機並不常見,因此使用16位數字是合理的。 對於常見的LCG實現,最低位是毫無價值的(在0和1之間切換),因此無論如何您都希望將其丟棄。
幾十年來的改進已使發電機更好了。 特別是, mt19937
生成器非常好,但仍然非常高效。 自2011年以來,C ++具有<random>
,其中包括std::mt19937
。 另外,為方便起見,您現在可以使用std::uniform_int_distribution<>(min,max)
選擇自己的分布
如前所述,不建議使用rand()
,並且切勿在實際情況下使用它。 但是要回答關於為什么只使用正整數的問題,這是因為生成負隨機整數是多余的,因此您可以使用基本數學從生成的正隨機數中生成負數。
舉個例子:如果我想產生一個介於-5和27之間的完全隨機的隨機數,我可以產生一個介於0和32(含)之間的隨機數,然后減去5。
#include <stdio.h>
#include <stdlib.h>
int main(){
int random = (rand() % 33) - 5;
printf("%d",random);
return 0;
}
因為這不是實際情況,所以我也沒有植入隨機數。 因此,您不應該在代碼中使用此功能,但是它幾乎適用於任何RNG函數,您只需從正值中減去負值范圍即可。 但是,您應該使用C ++ 11隨機數生成器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.