C ++中-10到10的随机数

时间:2010-04-19 07:50:39

标签: c++ random

如何在C ++中以-10到10的间隔制作随机数?

srand(int(time(0)));//seed
for(int i  = 0; i < size; i++){
 myArray[i] = 1 + rand()  % 20 - 10;//this will give from -9 to 10
 myArray2[i] =rand()  % 20 - 10;//and this will -10 to 9
}

11 个答案:

答案 0 :(得分:10)

要获得统一分布,您必须先分配RAND_MAX

static_cast<int>(21*static_cast<double>(rand())/(RAND_MAX+1)) - 10

使用

rand() % 21 - 10;

更快,经常在应用程序中使用,但结果分布不均匀。函数rand()生成从0RAND_MAX的数字。如果RAND_MAX%21!=0更低的数字生成概率更高。

您也可以考虑使用模数方法,但删除一些随机数:

int randMax = RAND_MAX - RAND_MAX%21;

int p=RAND_MAX+1;
while(p>randMax)
        p=rand();

x=p%21 - 10;

编辑(Johannes和Steve的评论):

当用RAND_MAX分割时,范围中会有一些数字会更频繁地被选中,因此正确的处理方法是拒绝会导致目标间隔分布不均匀的数字。

使用Boost随机库(Danvil提到),消除了随机数均匀性的所有问题。

答案 1 :(得分:8)

你需要21的范围,而不是20,所以做这样的事情:

x = rand() % 21 - 10;

答案 2 :(得分:8)

使用Boost Random Number Library。内置随机数发生器的分配质量差。此外,boost为您提供了许多有用的生成器。

// based on boost random_demo.cpp profane demo
#include <iostream>

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int.hpp>
#include <boost/random/variate_generator.hpp>

int main() {
  boost::mt19937 gen(42u); // seed generator
  boost::uniform_int<> uni_dist(-10, 10); // random int from -10 to 10 inclusive
  boost::variate_generator<boost::mt19937&, boost::uniform_int<> > 
    uni(gen, uni_dist); // callable

  for(int i = 0; i < 10; i++)
    std::cout << uni() << ' ';
}

输出:

-3 6 9 -7 5 6 2 2 -7 -1 

从未来开始注意:现在是built-in in C++11

答案 3 :(得分:4)

您可以使用[0,20]生成rand() % 21之间的随机数,然后从每个生成的数字中减去10

答案 4 :(得分:3)

使用C ++ 11的random库更加简单且不易出错(请参阅rand() Considered Harmful presentationslides了解更多详情)。以下示例在[-10,10]区间生成数字:

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;

    std::mt19937 e2(rd());

    std::uniform_int_distribution<int> dist(-10, 10);

    for (int n = 0; n < 10; ++n) {
            std::cout << dist(e2) << ", " ;
    }
    std::cout << std::endl ;
}

答案 5 :(得分:1)

您可以使用 Knuth的减法随机数生成器在(0,1)中生成一个数字'u',然后使用这个简单的线性方程在[-10,10]中得到一个随机数]:

-10*u + (1-u)*10

答案 6 :(得分:0)

你有一个fencepost错误 - 你感兴趣的范围比你使用的模数大一个;而是尝试:

myArray2[i] =rand()  % 21 - 10;//and this will -10 to +10

答案 7 :(得分:0)

rand() % 21 - 10

答案 8 :(得分:0)

如果您希望数字在[-10,10]范围内,那么您有21个可能的数字。

(rand() % 21) - 10;

答案 9 :(得分:0)

怎么样(rand()%21) - 10; ?

或者我在这里遗漏了什么?

答案 10 :(得分:0)

使用此功能:

int x = (rand() % 21) - 10;
cout<<x;