c++; 我最近一直在学习如何从一本初学者的书中C++编程游戏,我得到了一个教训,我必须在那里猜出电脑随机抽取的数字,我必须使用这行代码: srand(static_cast<unsigned int>(time(0))); variable=rand(); srand(静态_-cast(时间(0)); 变量=rand();

c++; 我最近一直在学习如何从一本初学者的书中C++编程游戏,我得到了一个教训,我必须在那里猜出电脑随机抽取的数字,我必须使用这行代码: srand(static_cast<unsigned int>(time(0))); variable=rand(); srand(静态_-cast(时间(0)); 变量=rand();,c++,C++,显然,我使用的是iostream cstdlib和ctime。我真的不明白这是如何工作的。它是如何选择时间和日期的,以及根据什么规则将其转换为无符号整数的。基本上,这些函数是如何工作的。 谢谢大家! 一,。关于time() time(或者在C++中更好的std::time)是一个函数,它返回以某种方式表示当前时间的整数或浮点数 它实际返回哪种算术类型以及它如何表示当前时间尚未确定,但是,最常见的情况是,您将得到一些整数类型,它保存自Unix纪元开始以来的秒数 2.关于srand() srand是

显然,我使用的是iostream cstdlib和ctime。我真的不明白这是如何工作的。它是如何选择时间和日期的,以及根据什么规则将其转换为无符号整数的。基本上,这些函数是如何工作的。 谢谢大家!

一,。关于
time()
time
(或者在C++中更好的
std::time
)是一个函数,它返回以某种方式表示当前时间的整数或浮点数

它实际返回哪种算术类型以及它如何表示当前时间尚未确定,但是,最常见的情况是,您将得到一些整数类型,它保存自Unix纪元开始以来的秒数

2.关于
srand()
srand
是一个函数,它使用它的参数(类型为
unsigned int
),即所谓的种子,来设置伪数生成器
rand
的内部状态。当我在剩下的答案中写随机数时,读伪随机数

使用不同的种子通常会导致对
rand
的后续调用产生不同的随机数序列,而再次使用相同的种子则会产生完全相同的随机数序列

3.使用
time()
播种
rand()
如果我们不希望每次运行程序时都得到相同的随机数,那么我们需要一些每次运行时都不同的种子。当前时间是一个广泛使用的种子来源,因为它不断变化

表示当前时间的这个整数(或返回的任何其它
time
)现在通过
static\u cast
转换为
unsigned int
。实际上并不需要这种显式强制转换,因为所有算术类型都隐式转换为
unsigned int
,但强制转换可能会使某些警告无效。随着时间的推移,我们可以预期得到的
无符号整数
,从而
随机数产生的序列会发生变化

4.陷阱 如果像通常情况一样,
time
返回自Unix纪元开始以来的秒数,则有三件重要的事情需要注意:

  • 只有在两次调用之间至少传递了一秒钟时,您生成的序列才会不同
  • 根据实际实现,如果用于种子
    rand
    的时间点彼此接近(与自历元以来的时间相比),则生成的序列可能会开始类似的类型。好了,MSVC的实现就是这样。如果这有问题,只需丢弃序列的前几百或几千个值。(正如我现在所了解到的,这对通常用于
    rand
    的可怜的RNG没有多大帮助。因此,如果这有问题,请使用
    ,如下所述。)
  • 你的数字最终并不是非常随机的:如果有人知道你对
    srand
    的调用是什么时候发生的,他们可以从中推导出整个随机数字序列。这实际上导致了一个用于勒索软件的解密工具,它使用
    srand(time(0))
    生成其“随机”加密密钥
  • 此外,由
    rand生成的序列往往具有较差的统计特性,即使种子是好的。对于像您这样的玩具程序,这可能是好的,然而,对于现实世界的使用,人们应该意识到这一点

    5.新的
    C++11引入了新的随机数工具,这些工具在许多方面优于旧的基于
    rand
    的工具。它们在标准标题中提供。它包括提供一种获取实际随机种子的方法、强大的伪随机数生成器,以及在不引入不必要的偏差的情况下将生成的随机序列映射到整数或浮点范围的工具

    下面是一个如何在C++11中随机滚动模具的示例:

    #include <random>
    #include <iostream>
     
    int main()
    {
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(1, 6);
     
        for (int n=0; n<10; ++n)
            std::cout << dis(gen) << ' ';
        std::cout << '\n';
    }
    
    #包括
    #包括
    int main()
    {
    std::随机_装置rd;
    标准:mt19937 gen(rd());
    标准:均匀分布分布图(1,6);
    对于(int n=0;n第一行:
    srand()是一个伪随机数生成器。在您的例子中,它是用系统上的当前时间(执行时间)初始化的。
    第二行:
    
    配置伪随机数生成器后,可以通过调用rand()检索随机数.

    查看
    srand
    rand
    的文档。在C++11或更高版本中,您应该使用中的类型。如果查看,您将看到它返回一个
    time\u t
    。如果查看,您将发现它几乎始终是一个整数类型。事实上,我不知道有哪个实现不是这样的。因此没有问题将其转换为常规的
    int
    .P.S.我不同意将其作为副本关闭,因为它要求更多的是
    time
    srand
    之间的交互,而不是rand/srand本身。