[英]Rand is still not working when im seeding the number
请注意,下面的代码尚未完全写出,我已经制作好了纸牌并洗牌了
我不明白为什么我没有两个随机数,我试图播种这些数字,但它似乎无法正常工作。 我想要的是每次我打印出脸/西服时应该是两个不同的数字/颜色。 我的错误在哪里?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct card{
const int *face;
const char *suit;
};
typedef struct card Card;
void dealing(const Card * const wDeck);
void shuffle(Card * const wDeck);
int main(){
srand(time(NULL));
shuffle(deck);
dealing(deck);
return(0);
}
void dealing(Card * const wDeck)
{
int j;
j = rand() % 52;
srand(time(NULL));
printf("%d of %s\n", wDeck[j].face, wDeck[j].suit);
printf("%d of %s\n", wDeck[j].face, wDeck[j].suit);
}
void shuffle(Card * const wDeck)
{
int i;
int j;
Card temp;
for (i = 0; i <= 51; i++) {
j = rand() % 52;
temp = wDeck[i];
wDeck[i] = wDeck[j];
wDeck[j] = temp;
}
}
删除调用srand()
从内部dealing()
每个程序调用一次(在main()
)调用srand()
就足够了。
void dealing(Card * const wDeck)
{
int j;
j = rand() % 52;
// srand(time(NULL)); /* no, no, no.
/* The PRNG has already been
/* seeded inside main() */
printf("%d of %s\n", wDeck[j].face, wDeck[j].suit);
printf("%d of %s\n", wDeck[j].face, wDeck[j].suit);
}
void dealing(Card * const wDeck)
{
int j;
j = rand() % 52;
srand(time(NULL));
printf("%d of %s\n", wDeck[j].face, wDeck[j].suit);
// ^^^ ^^^
printf("%d of %s\n", wDeck[j].face, wDeck[j].suit);
// ^^^ ^^^
}
您将第j
个元素的值打印两次。
dealing
在几个方面都有问题。
首先,您每次需要随机数时都调用srand()
。 rand
运行的方式是,它以种子编号开始,并在每次必须产生新的“随机”编号时对其执行复杂的算术运算。 因此,序列并不是真正随机的(这就是为什么它们被称为伪随机数生成器(PRNG)的原因。
每次您请求一个随机数时,您都将使用当前时间(以秒为单位)重新播种该序列。 现在,假设你的函数交易的卡在没有人为延迟紧的功能,是不是可能,你将始终与同一时间补种的PRNG? 如pmg所说,每次运行程序仅调用srand()
一次。
其次,我假设这是一个错字,您忘记了在选择第二张纸牌之前生成一个新的随机数。 (这是pmg的另一个答案。)实际上,由于您已经洗牌了,为什么不从牌组中选择前两张牌呢?
您没有说使用什么平台,但是在某些平台(例如OS X)上,srand / rand是非常差的随机数生成器。 如果有,应该使用随机/随机。 更好的是,如果您的平台已安装,则应使用arc4random_uniform() 。 这是因为rand() % 52
引入了偏差,因为52不是2的幂。某些数字比其他数字更有可能出现。
最后,您的随机播放在我看来还不错,但可能会有偏见。 我将使用费希尔耶茨(Fisher Yates)随机播放,该播放器无偏见。
void fisherYatesShuffle(Card* const deck, size_t cardCount)
{
for (size_t i = 0 ; i < cardCount ; ++i)
{
size_t upperCardIndex = cardCount - i - 1;
size_t pickIndex = arc4random_uniform(upperCardIndex + 1);
Card tmp = deck[upperCardIndex];
deck[upperCardIndex] = deck[pickIndex];
deck[pickIndex] = tmp;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.