0

我的书中有以下问题:

#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;如果 random(2) 给出 0 则 turn 变为 turn=0+5=5 这意味着我应该得到 10+5=15 和 16+5=21 以及 16 和 22 但我没有得到它们。

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

4

4 回答 4

1

也许这有帮助:

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

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

C++ rand() 在运行进程时给出相同的数字

于 2013-03-21T14:05:30.490 回答
1

您需要提供一个seed有助于获得“真正”随机的值。妈妈们

于 2013-03-21T14:06:33.493 回答
1

计算机本身无法随机化数字,它为此使用种子。

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

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

这个视频解释了它。

于 2013-03-21T14:16:00.280 回答
0

因为Turn只随机化一次 - 在循环的开始。如果你将赋值Turn移到你的循环中,你应该得到15并且21

#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));
于 2013-03-21T14:11:17.890 回答