【问题标题】:generate a random number between 1 and 10 in c在c中生成一个1到10之间的随机数
【发布时间】:2013-07-24 15:34:49
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main()

{
    int randomnumber;
    randomnumber = rand() % 10;
    printf("%d\n", randomnumber);
    return 0;
}

这是一个简单的程序,其中 randomnumber 是一个未初始化的 int 变量,旨在打印为 1 到 10 之间的随机数。但是,每当我一遍又一遍地运行时,它总是打印相同的数字。有人可以帮忙告诉我为什么会这样吗?谢谢你。

【问题讨论】:

  • 了解srand()
  • 您很可能在该选择中存在偏见。
  • @chris:是的,但这种情况下的偏见相当小;因为RAND_MAX 至少为 32767,偏差小于 3000 的一部分,如果您需要质量更好的伪随机数,您可能应该使用比rand() 更好的东西。尽管如此,它可能还是值得解决的,特别是如果您想要更大的范围(接近RAND_MAX)。 comp.lang.c FAQ 的问题 13.16 显示了如何做到这一点。
  • @KeithThompson,确切地说,最好从正确开始而不是从问题开始,以后必须了解并解决它们。
  • your_lucky_number = (rand() % 10) + 1;而且,当然例如: int min=12;整数最大值=33; your_number = (rand() % (max+1-min)) + min;

标签: c random


【解决方案1】:
srand(time(NULL));

int nRandonNumber = rand()%((nMax+1)-nMin) + nMin;
printf("%d\n",nRandonNumber);

【讨论】:

    【解决方案2】:

    这是一个使用 c 的随机数生成器的准备运行源代码,取自该站点: http://www.random-number.com/random-number-c/ .这里的实现更通用(一个获取3个参数的函数:min,max和要生成的随机数)

    #include <time.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    // the random function
    void RandomNumberGenerator(const int nMin, const int nMax, const int  nNumOfNumsToGenerate)
    {
      int nRandonNumber = 0;
      for (int i = 0; i < nNumOfNumsToGenerate; i++)
      {
        nRandonNumber = rand()%(nMax-nMin) + nMin;
        printf("%d ", nRandonNumber);
      }
      printf("\n");
    }
    
    void main()
    {
      srand(time(NULL));
      RandomNumberGenerator(1,70,5);
    }
    

    【讨论】:

      【解决方案3】:

      在程序中生成单个随机数是有问题的。随机数生成器只是“随机”,因为重复调用会根据给定的概率分布生成数字。

      播种 RNG 不会有帮助,尤其是如果您只是从低分辨率计时器播种它。您只会得到作为时间哈希函数的数字,如果您经常调用该程序,它们可能不会经常更改。使用srand(time(NULL) + getpid())(Windows 上为_getpid())可能会有所改善,但这仍然不是随机的。

      获取随机数的唯一方法跨越 程序的多次调用是从程序外部获取它们。这意味着使用/dev/random (Linux) 或CryptGenRandom() (Windows) 等系统服务,或random.org 等服务。

      【讨论】:

      • 感谢 lee,您知道如何使用系统服务在 MAC 上获取合法的随机数生成器吗?仅供参考:我正在使用 Xcode。
      • 我不是 Mac 用户,但我相信他们足够像 Unix,他们有 /dev/random/dev/urandom
      • 这取决于使用情况。你想写一个加密敏感数据的程序吗?然后天真地使用RNG是非常不好的。你想初始化一个粒子模拟吗? srand() 和 rand() 应该没问题(除非你想在学术环境中分析系统)
      【解决方案4】:

      您需要从man 3 rand 为随机数生成器播种

      如果没有提供种子值,则 rand() 函数会自动为种子值 1。

      srand() 函数将其参数设置为要由 rand() 返回的新伪随机整数序列的种子。这些序列可以通过调用具有相同种子值的 srand() 来重复。

      例如

      srand(time(NULL));
      

      【讨论】:

        【解决方案5】:

        每次执行都需要不同的种子。

        您可以在程序开始时开始调用:

        srand(time(NULL));
        

        请注意,% 10 会生成从 09 的结果,而不是从 110:只需将 1 添加到您的 % 表达式即可得到 110 .

        【讨论】:

        • 谢谢,但是当我添加 srand(time(NULL));在我声明变量随机数之后,编译器给了我错误隐式转换失去整数精度:'time_t(又名'long')到'unsigned int'
        • @Nisarg;使用srand((unsigned)time(NULL))srand()unsigned 值作为参数。
        • @Nisarg 您可以放心地忽略此消息或将函数参数强制转换为 unsigned int 以使其静音。
        • @Nisarg;并且还包括 time.h 标头用于 time() 函数。
        • 在每次调用之前重新播种不会给出随机数,它会给出时间的哈希函数,或者任何你用来播种的东西。这对于某些用途可能已经足够了,但它根本没有使用 PRNG 算法。 @Nisarg,仅仅因为某些东西似乎有效,但这并不正确。
        猜你喜欢
        • 2014-12-09
        • 2010-12-06
        • 2013-12-21
        • 1970-01-01
        • 2017-03-12
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多