我正在使用
#include<conio.h>
#include<stdlib.h>
从1-10生成随机数。
代码是:
rando = rand() % 10 + 1;
由于某种原因2继续生成。我的措辞有问题吗?
答案 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::mt19937
和std::uniform_int_distribution
。
您可能需要read this answer了解更多详情 (我不会在这里复制代码并回答文本)。