我使用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;
}
答案 0 :(得分:6)
您机器上的RAND_MAX显然接近或达到标准允许的最低值:32767。
有很多替代方案可以提供更好的周期性。 Mersenne Twister是一个很好的选择,是C ++ 11标准的一部分。
另请注意,返回语句后的语句无法访问。考虑一下
std::vector<int>
作为返回类型。
答案 1 :(得分:3)
According to the documentation,rand()
函数返回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位,然后将两个结果进行异或运算来实现这种连接。