C++ 为什么;使用sleep();使相同代码的结果不同?

C++ 为什么;使用sleep();使相同代码的结果不同?,c++,C++,我编写了一个程序,创建了一个包含随机字符串的字符串数组,rand\u str()将一个长度为20的字符串。当我使用sleep()时,结果正是我想要的。但是,我认为sleep()不应该出现在我的代码中。删除sleep(),创建的随机字符串完全不同。我真的很困惑。有人能解释一下为什么会这样吗 #include <iostream> #include <string.h> #include <random> #include <ctime> #inclu

我编写了一个程序,创建了一个包含随机字符串的字符串数组,
rand\u str()
将一个长度为20的字符串。当我使用
sleep()
时,结果正是我想要的。但是,我认为
sleep()
不应该出现在我的代码中。删除
sleep()
,创建的随机字符串完全不同。我真的很困惑。有人能解释一下为什么会这样吗

#include <iostream>
#include <string.h>
#include <random>
#include <ctime>
#include <cstdlib>
#include <windows.h>
#include <stdlib.h>
#include <array>
#define show(w) for(auto val:w){cout<<val<< " ";}cout<<endl;
using namespace std;

char *rand_str(char *str,const int len);

int main(){
    const int len = 10;
    char *a[len];
    string c[len];
    array<string,len> ar;char b[len][21];
    for (int i = 0; i < len; ++i) {
        ar[i] = rand_str(b[i], 21);
        fflush(stdin);
//      Sleep(1000);
    }
    show(ar);
    return 0;
}
char *rand_str(char *str,const int len){
    srand(time(NULL));
    int i;
    for(i=0;i<len;++i)
    {
        switch((rand()%3))
        {
            case 1:
                str[i]='A'+rand()%26;
                break;
            case 2:
                str[i]='a'+rand()%26;
                break;
            default:
                str[i]='0'+rand()%10;
                break;
        }
    }
    str[len - 1]='\0';
    return str;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括

使用sleep():


这很可能是因为计算机不能产生真正的随机数。 因此,存在一个称为种子的概念。伪随机数生成最常见的
种子是时间。

让您的程序稍等一点将使其使用不同的种子运行随机生成器。

rand_str
很可能与它有某种时间依赖性。您呈现的一个有一个种子集为
srand(time(NULL))确实如此

Sleep(1000)
(最低睡眠时间为1000个单位)足以改变结果


删除睡眠调用和程序执行的速度足够快,因此无法观察到
rand_str
的时间依赖性。

您的
rand_str
函数在每次调用时重新为PRNG设定种子,并使用当前时间(以秒为单位)执行此操作。然后,它取出该序列中的“第一个”数字并返回它

这意味着对于不同时间的函数调用,只能得到不同的伪随机序列。如果在同一秒钟内进行多个函数调用,则使用相同的种子继续重新设定种子,这将导致相同的序列,并且该序列中的第一个数字始终是返回的相同数字。这就是为什么睡眠会带来不同:它会改变种子

你应该,然后,只要需要


顺便说一句,整个方法已经过时了。从C++11开始,.

您编写的程序执行速度足够快,因此极有可能在一秒钟内发生
rand_str
的每个循环。这一点很重要,因为生成字符串的方法涉及调用
time
,因为
time
返回一个
time\t
对象,该对象在C标准中指定为:

未指定日历时间的时间编码,但大多数系统都符合POSIX规范,并返回一个整数类型的值,该值包含自历元以来的秒数。时间t为32位有符号整数的实现(许多历史实现)在2038年失败

-
时间

因此,如果整个程序在不到一秒钟的时间内执行,那么在该时间跨度内对
time
的每次调用都将返回相同的值,每次使用相同的值为随机数播种,并在每个循环上产生相同的输出。相反,当您
睡眠
1000毫秒(1秒)时,您几乎可以保证每次执行都会有不同的种子,从而产生不同的输出


通常,在程序开始时,您应该只为随机数种子设定一次。另外,你应该考虑如何使用这个库,因为它包含了更好的生成随机数的机制。

请包含问题中的代码。链接可能中断,图像无法编译,因此代码总是首选抱歉,我是新来的~您需要提供足够的代码让我们重现问题,或者至少编译您的代码:我们不知道rand_str
做什么,因此,我们无法确定是什么样的交互导致了这种行为。在Linux中使用/dev/random或查看此处
/dev/random
是不可移植的。有时候你不想要真正的随机数。通过控制种子,您可以使用相同的“随机数”重新运行程序,这使调试更加容易。您是否认为1毫秒内生成的随机数由于种子而完全相同?@Merediii这完全正确,但这是您的代码的错误,而不是随机数生成器的错误。您不必使用时间作为种子,也不必使用秒分辨率时间作为种子,也不必一次又一次地播种。:)看看
rand\u str()
这正是它正在发生的事情。函数在函数开始时使用时间初始化种子。但由于该函数在短时间内多次重新启动。时钟将没有时间前进,因此您将始终使用相同的值进行种子设定,并获得相同的伪随机数。(时间()的分辨率通常为1秒)。正确的解决方案是在程序开始时调用一次
srand()
。“计算机不能产生真正的随机数”是的,它们可以使用特殊的硬件,尽管在编写时速度非常慢,如伪生成器。