在播种时,兰德仍然没有工作

时间:2015-12-22 14:31:33

标签: c random

请注意,以下代码并未完全写出来,我已经制作了套牌并将卡片洗牌

我不明白为什么我没有得到两个随机数字,我试图给这些数字播种,但它似乎没有正常工作。 我想要的是每次我打印出面/套装它应该是两个不同的数字/颜色。我的错误在哪里?

#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;
    } 
} 

3 个答案:

答案 0 :(得分:2)

srand()内删除对dealing()的来电。 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;
    }
}