簡體   English   中英

為什么rand()的范圍小於int的范圍?

[英]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()作用:

返回介於​0RAND_MAX之間的偽隨機整數值(包括0RAND_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.

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