【问题标题】:rand() doesn't create random numbers [duplicate]rand() 不会创建随机数 [重复]
【发布时间】:2013-06-04 23:02:54
【问题描述】:

到目前为止,我有一个简单的程序可以创建 5 张公共卡片(全部为整数)。我已经设法设置了这些(它们是全局变量,这是故意的),但是每次我运行程序时,它们都会创建相同的数字。下面是代码。

int communityCards[5];
int playerCards[2];
int opponentCards[2];
int communityValues[5];
int playerValues[2];
int opponentValues[2];

int main(int argc, const char * argv[]) {
    for (int i = 0; i < 9; i++) {
        if (i < 5) {
            communityCards[i] = rand() % 52 - i;
            for (int a = 0; communityCards[a]!=0; a++) {
                communityCards[i]==communityCards[a]?communityCards[i]++: a = a;
            }
        }
        printf("%i ", communityCards[i]);
    }
}

【问题讨论】:

标签: c++ random


【解决方案1】:

在调用rand 之前,只使用一次带有适当种子的srand。通常使用srand(time(0))

另外,C++11 提供了很多更好的 random number generators 和细粒度的规范(rand 基本上不保证它产生的数字的质量)。

【讨论】:

    【解决方案2】:

    你想在main的开头调用一次srand(time(NULL));

    不过,顺便说一句,您的其余逻辑似乎可能是错误的。特别是,现在您可以(例如)将 5 张 A 作为公共牌发牌(或者您的循环/条件是否打算解决这个问题?)

    通常你会想要装满一副牌,用std::random_shuffle 洗牌,然后将牌从那里移到社区、玩家和对手的手上。

    【讨论】:

    • time 的精度为 1 秒,因此同时启动多个副本将产生相同的结果。
    • @SigTerm:C++ 标准没有指定time 的精度。 1 秒很常见,但也可能是一纳秒或一小时。
    • @JerryCoffin,哇,我以前从未听说过。到目前为止,我还没有遇到任何人声称只有一秒钟。很高兴知道,谢谢。
    • 这是专门用来解决这个问题的,我检查了 communityValues[i]==communityValues[a]。
    • @chris:我可能还应该补充一点,尽管 C 标准没有指定其精度(或纪元),但如果内存服务于 POSIX 确实指定了两者(即,time 返回自午夜以来的秒数, 1970 年 1 月 1 日)。
    【解决方案3】:

    在程序开头写上srandfunc 它将以当前时间为种子

    int main()
    {
        srand(time(0));
    
        // STUFF
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2013-10-28
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2023-03-19
      相关资源
      最近更新 更多