请注意,以下代码并未完全写出来,我已经制作了套牌并将卡片洗牌
我不明白为什么我没有得到两个随机数字,我试图给这些数字播种,但它似乎没有正常工作。 我想要的是每次我打印出面/套装它应该是两个不同的数字/颜色。我的错误在哪里?
#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;
}
}
答案 0 :(得分:2)
从srand()
内删除对dealing()
的来电。 1}}每个程序调用(srand()
)调用main()
就足够了。
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);
}
答案 1 :(得分:2)
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
元素的值。
答案 2 :(得分:0)
dealing
在几个方面存在问题。
首先,每当您想要一个随机数时,您就会调用srand()
。 rand
的工作方式是它从种子编号开始,每次必须生成一个新的&#34;随机&#34;时,就会对它进行复杂的算术运算。数。因此,序列并不是真正随机的(这就是为什么它们被称为伪随机数生成器(PRNG))。
每次要求随机数时,您都会以当前时间(以秒为单位)重新播种序列。现在假设你的功能以紧凑的功能处理卡而没有人为的延迟,你是不是总是用同时重新播种PRNG?正如pmg所说,每次运行程序只需拨打一次srand()
。
其次,我假设这是一个错字,你忘了在选择第二张卡之前生成一个新的随机数。 (这是另一个答案。)实际上,由于你已经洗牌了,为什么不从甲板上选择前两张牌呢?
你不会说你正在使用什么平台,但是对于某些平台(比如OS X),srand / rand是一个非常差的随机数生成器。如果你有它,你应该使用srandom / random。更好的是,如果你的平台已经得到它,你应该使用arc4random_uniform()。这是因为rand() % 52
引入了偏见,因为52不是2的幂。有些数字比其他数字更有可能出现。
最后,你的洗牌看起来很好,但它可能有偏见。我会使用已知无偏见的Fisher Yates shuffle。
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;
}
}