Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么随机数生成器的数字大小受到限制?_C++_Random_Numbers_Generator - Fatal编程技术网

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的统计特性