繁体   English   中英

C++ Header 文件不创建随机数

[英]C++ Header file not creating random number

我第一次尝试创建 header 文件。 解决方案是废话,无非是实践。 它从主文件接收两个数字,并应该从向量返回一个随机条目。 当我从主文件的循环中调用它时,它会增加 3 而不是随机增加。 (通过返回 getEntry 的值进行诊断。)如果我从 header 文件中将其拉出并作为程序直接运行,则 Randomizer 代码可以正常工作。

int RandomNumber::Randomizer(int a, int b){
    std::vector < int > vecArray{};
    int range = (b - a) + 1;

    time_t nTime;
    srand((unsigned)time(&nTime));

    for (int i = a-1; i < b+1; i++) {
        vecArray.push_back(i);
    }

    int getEntry = rand() % range + 1;

    int returnValue = vecArray[getEntry];
    vecArray.clear();

    return returnValue;
}

根据我的阅读,header 文件通常不应包含 function 和变量定义。 我怀疑作为 function 的兰德是问题的根源。

如果可能的话,我怎样才能让我的 header 文件创建随机数?

void random(){
    double rangeMin = 1;
    double rangeMax = 10;
    size_t numSamples = 10;

    thread_local std::mt19937 mt(std::random_device{}());
    std::uniform_real_distribution<double> dist(rangeMin, rangeMax);

    for (size_t i = 1; i <= numSamples; ++i) {
        std::cout << dist(mt) << std::endl;
    }
}

此方法将使您有机会生成随机数,在两个数字之间,此方法您必须包含random

在很多情况下,您会选择生成一个断断续续的号码。 您确实需要两个函数来了解任意数字的生成。 第一个是rand(),这个function只会返回一个伪断断续续的数字。 对此进行微调的方法是首先调用 srand() function。

这是一个例子:

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;
 
int main () {
   int i,j;
 
   
   srand( (unsigned)time( NULL ) );

   for( i = 0; i < 10; i++ ) {
      
      j = rand();
      cout <<" Random Number : " << j << endl;
   }

   return 0;
}

使用srand( (unsigned)time( NULL ) ); 不要使用您自己的值,而是使用NULL作为默认设置。 您也可以在这里go 了解更多信息。

我希望我回答了你的问题! 祝你今天过得愉快!

Ted Lyngmo 给了我解决问题的想法。 在 header 文件中使用随机似乎可以正常工作。

我删除/更改了以下内容:

time_t nTime;
srand((unsigned)time(&nTime));
int getEntry = rand() % range + 1;

并将它们替换为:

std::random_device rd;
std::mt19937 gen(rd());
int getEntry = gen() % range + 1;

问题解决了。 谢谢大家的建议和意见!

作为一个实验,我删除了向量并专注于随机化器`srand(T)`,其中`T`是系统时间`volatile time_t T = time(NULL)`。 然后我们发现系统在程序运行期间没有改变(执行太快了)。

function `rand()` 使用合流随机数生成器生成伪随机 integer ,基本上将种子乘以另一个更大的无符号 Z157DB7DF530023575515D366C9B6 的有限位。 随机发生器 `srand(T)` 用于使用系统时间或任何数字 `srand(12345);` 来初始化种子。 种子给出一个固定的随机数序列。 不调用 `srand(T)`,种子由系统初始 memory gabage 确定。 然后在每次生成的 rand() 中更改种子。

在您的代码中,您发出 randomizer `srand(T)` 在每次运行中将种子重置为系统时间。 但是系统时间没有改变,因此,您将“种子”重置为相同的数字。

运行此测试。

#include <cstdlib>
#include <iostream>
#include <ctime>
int Randomizer(int a, int b){
    volatile time_t T = time(NULL);
    std::cout << "time = " << T << std::endl;
    srand(T);
    std::cout << "rand() = " << rand() << std::endl;
    return rand();
}
int main()
{
   int n1 = 1, n2 = 8;
   for(int i=0; i<5; ++i)
   {
        std::cout << Randomizer(n1, n2) << std::endl;
   }
}

种子被重置为系统时间,在执行过程中不会改变。 因此它呈现相同的随机数。

$ ./a.exe
time = 1608049336
rand() = 9468
15874
time = 1608049336
rand() = 9468
15874
time = 1608049336
rand() = 9468
15874
time = 1608049336
rand() = 9468
15874
time = 1608049336
rand() = 9468
15874

为了查看系统时间的变化,我们在main()中添加了一个暂停:

int main()
{
    int n1 = 1, n2 = 8;
    for(int i=0; i<5; ++i)
    {
        std::cout << Randomizer(n1, n2) << std::endl;
        system("pause");
    }
}

我们可以观察到系统时间在移动......

$ ./a.exe
time = 1608050805
rand() = 14265
11107
Press any key to continue . . .

time = 1608050809
rand() = 14279
21332
Press any key to continue . . .

time = 1608050815
rand() = 14298
20287
Press any key to continue . . .

因为系统时间相差不大,第一代合流序列 rand() 也相当封闭,但连续的数字序列将“看似”随机。 融合随机发生器的原理是一旦设置种子就不要改变它。 直到您为另一系列随机集工作。 因此,只需将 srand(T) 函数放在 main() 中或仅执行一次的地方。

int main()
{
    srand(time(NULL)); // >>>> just for this once  <<<< 
    int n1 = 1, n2 = 8;
    for(int i=0; i<5; ++i)
   {
        std::cout << Randomizer(n1, n2) << std::endl;
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM