随机数生成机制
我在我的书中以下问题:随机数生成机制
#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#?我想这个程序的机制。谢谢。 turn = random(2)+5; 如果random(2)给出0,那么turn变成turn = 0 + 5 = 5这意味着我应该得到10 + 5 = 15和16 + 5 = 21以及16和22,但是我没有得到它们。
我们在我们的计算机科学理论考试中得到了上述问题,我们选择了正确的答案(即它产生了16和22),但我将如何知道它将只产生16和22。上述15和21解释也是可以的..
因为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();
}
而且,有人说了,如果你想输出运行之间的不同,你需要种子的随机号码发生器,例如通过呼叫seed。例如:
#include <time.h>
(...)
srand(time(NULL));
int Turn = random(2)+5;如果random(2)给出零,那么turn的值就变成(turn = 0 + 5)5。那么我应该得到15和21 ..但我没有得到它! – Smatik 2013-03-21 14:15:47
是的,但是由于您的随机生成器没有种子,您将始终从运行中获得相同的值以运行。用不同的值对它进行种子处理(例如使用'time(NULL)'),并且你应该看到不同。然而,如果不移动“Turn”的分配,你总是会得到包含16和22或15和21的运行。 – sonicwave 2013-03-21 14:22:35
我永远不会得到15和21.总是16和22 .. – Smatik 2013-03-21 14:24:15
也许这会有所帮助:
随机数发生器种子未设置。
如果调用函数srand(时间(NULL)),那么你会得到更多的随机结果
你需要给一个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
this video解释它。
'randomize()'做了什么? – Kevin 2013-03-21 14:06:59
此代码不会在现代C++编译器上编译(并且从来没有有效的C++代码!),这导致我认为您确实需要升级您的工作环境。 – 2013-03-21 14:08:30
我使用turbo C++进行快速编译 – Smatik 2013-03-21 14:14:06