随机数发生器不断创建2

时间:2014-10-08 07:26:56

标签: c++ random

我正在使用

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

从1-10生成随机数。

代码是:

rando = rand() % 10 + 1;

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

如果你正在使用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);

答案 2 :(得分:0)

1)你不应该使用rand(),它有不良分布,短期等......

2)在%x时你不应该使用MaxValue % x != 0,因为你弄乱了你的统一发行版(假设你没有使用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));
}

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

答案 3 :(得分:0)

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

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

您可能需要read this answer了解更多详情 (我不会在这里复制代码并回答文本)。