由于这是一个令人敬畏的意外特征,它使得“洗牌”一系列“卡片”变得糟糕。我得到相同数字的事实告诉我,每次采摘单独的种子时我都遇到了一些问题。我是否未正确使用srand48
或time(NULL)
来电?我缺少一些潜在的逻辑漏洞吗?迭代之间是否有足够的时间使time()
的值不同?
代码正在Linux上运行。
void shuffle()
{
int i_rnd; /* Integer random number, range 0..100 */
int i_rnd2;
card tempCard; /*temporary card to facillitate swapping*/
int i = 0; /*can't use a FOR loop 'cause we're not using c99 standard*/
while(i < 1000)
{
srand48( (unsigned) time( NULL ) ); /* Seed the random number generator */
i_rnd = (int) ( drand48() * 100);
i_rnd = i_rnd%52; // return a random number 0-51
i_rnd2 = (int) ( drand48() * 100);
i_rnd2 = i_rnd2%52; // return a random number 0-51
/*we have two random numbers, now exchange the two objects with the
/ picked array indices */
tempCard = cardDeck[i_rnd];
cardDeck[i_rnd]=cardDeck[i_rnd2];
cardDeck[i_rnd2]=tempCard;
//swap complete. increment counter so we can eventually get out of the while
i++;
}
return;
}
答案 0 :(得分:14)
您需要为伪随机数生成器播种一次,而不是每次都使用它。
在给定某个种子值的情况下,许多(大多数?)伪随机数生成器(PRNG)是确定性的。如果time()
每次循环执行时返回相同的值,则每次使用PRNG时都会使用相同的值,因此当您查询随机数时,它会返回相同的值。
答案 1 :(得分:5)
因为你每次通过循环使用相同的种子播种你的随机数生成器(它在不到一秒的时间内运行)。在程序开头调用srand48()
ONCE。
答案 2 :(得分:0)
PRNG总是具有确定性...... PRNG的随机性不是由它的逻辑实现的,而是由它使用的种子实现的。
因此,尽可能使种子为随机,以实现随机性。