为什么随机数发生器的数字大小有限?

时间:2017-02-07 17:49:54

标签: c++ random numbers generator

我使用srand()编写了一个随机数生成器,它创建了一个给定大小的随机数数组。我希望我的随机数值达到1000.000并且为了得到这个,我已经在下面的代码中将数组的每个条目定义为rand()%1000000。奇怪的是,随机值都高达约30.000并且没有创建更大的随机数,例如987.623,即随机数的数字计数不超过5。 有谁知道为什么会这样?是否有其他方法(功能)可以提供比这些更大的随机数?

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#include <cmath>
#include <vector>
using namespace std;

int * rng(int size) {
    int* a = NULL;
    a = new int[size];
    for (int i = 0; i < size; i++) {
        a[i] = rand() % 1000000;
        if (a[i] == 0) {
            a[i] += 1;
        }
    }
    for (int j = 0; j < size; j++) {
        cout << a[j] << " ";
    }
    delete[] a;
    a = NULL;
    return a;
}

int main() {   
    srand(time(NULL)); 
    int size;
    int* x;
    ifstream myfile("size.txt");
    ofstream outfile("input.txt");
    while (myfile>>size) {   
        x=rng(size);
        if (outfile.is_open()) {    
            for(int count = 0; count < size; count ++) {
                outfile<< x[count] << " " ;
            } 
        myfile.close();
        }       
    }
    return 0;
    delete [] x;  
    x = NULL;
}

2 个答案:

答案 0 :(得分:6)

您机器上的RAND_MAX显然接近或达到标准允许的最低值:32767。

有很多替代方案可以提供更好的周期性。 Mersenne Twister是一个很好的选择,是C ++ 11标准的一部分。

另请注意,返回语句后的语句无法访问。考虑一下

std::vector<int>

作为返回类型。

答案 1 :(得分:3)

According to the documentationrand()函数返回0到RAND_MAX之间的数字,再次according to the documentation 实现定义的 即可。 “实现定义”意味着“无论您的编译器供应商想要它是什么”。在这种情况下,您的编译器供应商决定它应该是大约30000,很可能是32767,以避免破坏与其旧的16位版本的编译器的兼容性。

你可以选择另一个编译器,或者你可以做一些技巧,如下所示:

int my_random_number = rand() ^ (rand() << 15);

以上假设您的rand()函数具有15位范围(数字从0到32767),因此它将来自一次调用的15位与来自另一次调用的另外15位连接起来,总共产生30位,其范围远大于您需要的0到1.000.000。通过将第二次调用的结果向左移位15位,然后将两个结果进行异或运算来实现这种连接。