随机数生成器不断创建2

Random number generator keeps creating 2

本文关键字:创建 随机数生成器      更新时间:2023-10-16

我正在使用

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

以生成1-10的随机数。

代码是:

rando = rand() % 10 + 1;

由于某种原因2一直在生成。我的措辞有问题吗?

要生成从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;

如果您使用C++11,您可以考虑使用<random>标头(您还必须为随机引擎播种):

#include <random>
std::random_device rd;
std::default_random_engine dre(rd());
std::uniform_int_distribution<int> uid(1,10);
int number = uid(dre);

1)你不应该使用rand(),它有分布不好、周期短等…

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

观看此获取更多信息:走向本土2013-Stephan T.Lavavej-rand()被认为有害

你应该使用这样的东西:

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

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

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

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

您可能想阅读此答案以了解更多详细信息
(我不会在这里重复代码和答案文本)。