【问题标题】:Random number generator keeps creating 2随机数生成器不断创建 2
【发布时间】:2014-10-08 07:26:56
【问题描述】:

我正在使用

#include<conio.h>
#include<stdlib.h>

从 1 到 10 生成一个随机数。

代码是:

rando = rand() % 10 + 1;

由于某种原因 2 不断生成。我的措辞有问题吗?

【问题讨论】:

标签: c++ random


【解决方案1】:

要生成从 1 到 10 的随机数,你应该使用rand() % 10 + 1 但首先需要初始化随机种子,看例子:

  #include <stdio.h>      /* printf, NULL */
  #include <stdlib.h>     /* srand, rand */
  #include <time.h> 

  int iSecret ;

  /* initialize random seed: */
  srand (time(NULL));

  /* generate secret number between 1 and 10: */
  iSecret = rand() % 10 + 1;

【讨论】:

  • 注意: 除非您知道 为什么 这样做,否则应该调用 srand() 一次您的过程的生命周期。 不要将此答案中的所有代码剪切/粘贴到您期望重复调用的单个函数中。
  • 通常在程序中初始化调用一次
【解决方案2】:

如果您使用的是 C++ 11,则可以考虑使用 &lt;random&gt; 标头(您还必须为随机引擎播种):

#include <random>

std::random_device rd;
std::default_random_engine dre(rd());

std::uniform_int_distribution<int> uid(1,10);

int number = uid(dre);

【讨论】:

    【解决方案3】:

    1) 你不应该使用rand(),它的分布不好,周期短等等......

    2) 你不应该在MaxValue % x != 0 时使用%x,因为你会弄乱你的均匀分布(假设你不使用 rand()),例如32767 % 10 = 7 所以数字 0-7 更有可能得到

    观看此内容了解更多信息:Going native 2013 - Stephan T. Lavavej - rand() Considered Harmful

    你应该使用类似的东西:

    #include <random>
    
    std::random_device rdev;
    std::mt19937 rgen(rdev());
    std::uniform_int_distribution<int> idist(0,10); //(inclusive, inclusive) 
    

    我在我的代码中使用这样的东西:

    template <typename T>
    T Math::randomFrom(const T min, const T max)
    {
        static std::random_device rdev;
        static std::default_random_engine re(rdev());
        typedef typename std::conditional<
            std::is_floating_point<T>::value,
            std::uniform_real_distribution<T>,
            std::uniform_int_distribution<T>>::type dist_type;
        dist_type uni(min, max);
        return static_cast<T>(uni(re));
    }
    

    注意:实现不是线程安全的,并为每个调用构造一个分布。那是低效的。但您可以根据需要对其进行修改。

    【讨论】:

    • Re point 1:这取决于你在做什么。对于严肃的分析工作(蒙特卡洛评估等),您不应该使用rand()。对于只是玩玩和游戏,rand() 通常就足够了,而且简单得多。
    【解决方案4】:

    您的问题是您没有初始化 rand() 的种子,即您没有调用 srand()(通常是 srand(time(NULL)) 的旧形式),所以您得到了相同的数字序列。

    但是,无论如何,您不应该在 C++11 及更高版本中使用 rand()。 您可能想改用std::mt19937std::uniform_int_distribution

    您可能想read this answer了解更多详情。
    (我不会在这里复制代码和答案)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2012-10-23
      • 2022-01-21
      相关资源
      最近更新 更多