C++ 为什么随机数生成器的数字大小受到限制?
我使用C++ 为什么随机数生成器的数字大小受到限制?,c++,random,numbers,generator,C++,Random,Numbers,Generator,我使用srand()编写了一个随机数生成器,它创建了一个给定大小的随机数数组。我希望我的随机数的值最大为1000.000,为了得到这个值,我在下面的代码中将数组的每个条目定义为rand()%1000000。奇怪的是,所有的随机值都在30000左右,而更大的随机数(如987.623)没有被创建,即随机数的位数不超过5。 有人知道为什么会这样吗?有没有其他方法(函数)可以让随机数大于这些数 #include <iostream> #include <fstream> #inc
srand()
编写了一个随机数生成器,它创建了一个给定大小的随机数数组。我希望我的随机数的值最大为1000.000,为了得到这个值,我在下面的代码中将数组的每个条目定义为rand()%1000000
。奇怪的是,所有的随机值都在30000左右,而更大的随机数(如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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
整数*整数(整数大小){
int*a=NULL;
a=新的整数[大小];
对于(int i=0;i 您机器上的输出文件RAND_MAX明显接近或达到标准允许的最小值:32767
有很多可供选择的方案提供了更好的周期性。梅森捻机是这样一个好的替代方案,并构成C++11标准的一部分
还注意到返回语句后的语句是不可访问的。
std::vector<int>
std::vector
作为返回类型。您机器上的RAND_MAX显然接近或达到标准允许的最小值:32767 有很多可以提供更好的周期性的替代品。Mersenne Twister就是这样一个好的替代品,它是C++11标准的一部分
还注意到返回语句后的语句是不可访问的。
std::vector<int>
std::vector
作为返回类型。,rand()
函数返回一个介于0和rand_MAX
之间的数字,这也是实现定义的“实现定义”意味着“您的编译器供应商希望它是什么”。在这种情况下,您的编译器供应商决定它应该大约为30000,很可能是32767,以避免破坏与某些旧的16位版本的编译器的兼容性
您可以选择另一个编译器,也可以执行以下操作:
int my_random_number = rand() ^ (rand() << 15);
int my\u random\u number=rand()^(rand(),rand()
函数返回一个介于0和rand\u MAX
之间的数字,这也是实现定义的“实现定义”意味着“无论您的编译器供应商希望它是什么”。在这种情况下,您的编译器供应商决定它应该大约为30000,很可能是32767,以避免破坏与某些旧的16位版本的编译器的兼容性
您可以选择另一个编译器,也可以执行以下操作:
int my_random_number = rand() ^ (rand() << 15);
int my\u random\u number=rand()^(rand())作为旁注,您的代码会产生内存泄漏,因为返回a;
之后的所有内容都不会执行。请使用调试器逐步检查代码。感谢Raw N N 5,我会修复它。请注意,您可能没有实际调用srand()rng()现在总是返回null,您不需要在函数中删除<代码> a <代码>。考虑@ Bathsheba的替代来返回<代码> STD::vector < /代码>,或者只是在使用后删除。也有人喜欢在没有看到格式化代码的时候对DV按钮进行垃圾邮件,试着确保它复制正确:作为补充说明,您的代码会产生内存泄漏,因为返回a;
之后的所有内容都不会被执行。请使用调试器逐步检查代码。感谢Raw N 5,我将修复它。还请注意,您可能没有实际调用srand()rng()现在总是返回null,您不需要在函数中删除<代码> a <代码>。考虑@ Bathsheba的替代来返回<代码> STD::vector < /代码>,或者只是在使用后删除。也有人喜欢在没有看到格式化代码的时候对DV按钮进行垃圾邮件,试着确保它复制正确:谢谢。我使用DeV C++,尝试一些其他的“实现定义”,意味着编译器编写者可以根据标准中的约束来决定实现的执行。对于<代码> RANDMAX,约束是它的值必须至少为32767。这也意味着实现必须记录其行为。我更新了我的答案,并给出了解释。请注意,这只是一个快速而肮脏的黑客行为。在好日子里,这样的事情会被认为很酷。现在,它们往往会被人皱眉。但有时它们有助于帮助我们继续进行,而不会陷入细节。Mike ThaNKS:我认为XOR技巧会破坏发生器的统计特性。我认为它不能进行均匀性的卡方检验,特别是如果线性同余发生器中的乘法因子很小。请小心使用。谢谢。我使用DEV C++,将尝试其他一些“实现定义”。这意味着编译器编写器可以根据标准中的约束条件决定实现的功能。对于RAND_MAX
,约束条件是其值必须至少为32767。“实现定义”这也意味着实现必须记录其行为。我更新了我的答案,并给出了解释。请注意,这只是一个快速而肮脏的黑客行为。在好日子里,这样的事情会被认为很酷。现在,它们往往会被人皱眉。但有时它们有助于帮助我们继续进行,而不会陷入细节。Mike Thanks很多:)我认为XOR技巧损害了ge的统计特性