随机数生成器机制

Random Number Generator mechanism

本文关键字:机制 随机数生成器      更新时间:2023-10-16

我的书有以下问题:

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
    clrscr();
    randomize();
    int Game[]={10,16},P;
    int Turn=random(2)+5;
    for(int T=0;T<20;T++)
       {
           P=random(2);
           cout<<Game[P]+Turn<<"#";
       }
getch();
}

输出类似16#22#16#16#16#22#....20倍……为什么输出总是16#或22#?为什么不是15号或21号?我想介绍一下这个程序的机制。谢谢。把=随机(2)+ 5;如果随机(2)给出0,那么turn就变成了turn=0+5=5,这意味着我应该得到10+5=15和16+5=21以及16和22,但我没有得到它们。

我们在计算机科学理论考试中遇到了上面的问题,我们要选择正确的答案。E,它生成16和22)但是我怎么知道它只生成16和22。正如我上面解释的,15和21也是可能的。

也许这有帮助:

没有设置随机数生成器的种子。

如果你调用srand(time(NULL)),那么你将得到更多的随机结果

c++ rand()在运行进程

时给出相同的数字

您需要给出一个seed值,这将有助于获得"真正"随机。数

计算机不能自己随机化数字,它使用了一个种子。

但是种子并不是完全随机的,它们只是有特定的顺序,比如:

1
2
8
5
4

这些数字看起来很随机,但是当你下次运行程序时,你会得到:

1
2
8
5
4

完全一样。

为了防止这种情况,我们使用时间作为种子,时间总是在变化,所以它总是会产生新的数字。

#include <time.h>
srand(time(NULL));  // srand is the function to randomize numbers from a seed, we use 'time' as seed here

这个视频解释了

因为Turn只随机化一次-在循环开始时。如果你把Turn的赋值移到循环中,你也应该得到1521:

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
    clrscr();
    randomize();
    int Game[]={10,16},P;
    int Turn;
    for(int T=0;T<20;T++)
       {
           P=random(2);
           Turn=random(2)+5;
           cout<<Game[P]+Turn<<"#";
       }
    getch();
}

另外,正如其他人所说,如果您希望每次运行的输出不同,则需要为随机数生成器设置种子,例如,通过使用种子调用srand()。例如:

#include <time.h>
(...)
srand(time(NULL));