C+中从-10到10的随机数+; 如何在C++中的区间10到10中生成随机数?< /P> 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 } srand(int(time(0))//种子 对于(int i=0;i

C+中从-10到10的随机数+; 如何在C++中的区间10到10中生成随机数?< /P> 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 } srand(int(time(0))//种子 对于(int i=0;i,c++,random,C++,Random,您有一个fencepost错误——您感兴趣的范围比您使用的模大一个;相反,请尝试: myArray2[i] =rand() % 21 - 10;//and this will -10 to +10 rand()%21-10您需要的范围是21,而不是20,因此请执行以下操作: x = rand() % 21 - 10; 如果希望数字在[-10,10]范围内,则有21个可能的数字 (rand() % 21) - 10; 您可以使用rand()%21在[0,20]之间生成随机数,然后从每个生成

您有一个fencepost错误——您感兴趣的范围比您使用的模大一个;相反,请尝试:

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

rand()%21-10

您需要的范围是21,而不是20,因此请执行以下操作:

x = rand() % 21 - 10;

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

(rand() % 21) - 10;

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

如何(rand()%21)-10

还是我在这里遗漏了什么?

使用。内置的随机数生成器的分布质量非常差。此外,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() << ' ';
}

未来注意:这是现在。

要获得均匀分布,必须先用
RAND_MAX
除以

static_cast<int>(21*static_cast<double>(rand())/(RAND_MAX+1)) - 10
速度更快,通常用于应用程序中,但结果分布不均匀。函数
rand()
0
rand\u MAX
生成数字。如果
RAND\u最大值为%21=0
生成的数字越低,概率越高

你也可以考虑使用模方法,但是放弃一些随机数:

int randMax = RAND_MAX - RAND_MAX%21;

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

x=p%21 - 10;
编辑(约翰内斯和史蒂夫的评论):

当使用
RAND_MAX
进行除法时,会更频繁地从范围中选取一些数字,因此正确的处理方法是拒绝可能导致目标间隔上分布不均匀的数字

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

使用该库可以:

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

-10*u + (1-u)*10
使用C++11的库,这更简单,更不容易出错(有关更多详细信息,请参阅和)。下面的示例生成间隔
[-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 ;
}
#包括
#包括
int main()
{
std::随机_装置rd;
std::mt19937 e2(rd());
标准:均匀分布区(-10,10);
对于(int n=0;n<10;++n){

std::cout只是为了添加到这一点上……原因是实际上有21种可能性……将它们计算出来。包括0。请注意,使用天真的模数会偏向较小的数字。如果需要一致性,则需要拒绝一些数字
rand()
returns.rand()从0生成数字。RAND_MAX,其中RAND_MAX依赖于库,但必须至少为32767。如果RAND_MAX%21!=0,则获得某些数字的概率更高。在大多数实际应用中,这并不重要,但在某些科学计算中,这可能会严重影响计算结果。@zoli2k:值得注意-尽管如此,例如一个科学的计算,我不会依赖内置的rand()不管怎样。使用模而不是除法是一种更简洁的获取随机整数的方法。@Danvil它更快但错误。它不会生成均匀分布的随机数。@zoli2k:为了论证起见,假设RAND_MAX为2^16-1。因此,
RAND()有65536个可能的结果
。函数有21种可能的结果。由于65536不是21的倍数,因此函数不可能产生均匀分布。21种结果中的某些结果必须比其他结果更常见,只是这一点并不明显。为了“获得均匀的结果”,并没有进行除法而不是使用模数,这样做是为了解决一个事实,即LCG(因此,
rand()
)在连续输出(串行相关)之间具有微不足道的关系。例如,
rand()
可能会交替产生奇数和偶数结果,因此如果使用偶数进行mod,则会保留此属性。因此建议使用
rand()
进行除法。它仍然不能提供一致性,它通过使输出的(更好的变化)高位比(串行相关)具有更大的影响来改善情况低位。@Steve:根据生成器的不同,它不必有不好的低位。例如,Marsaglias的带进位生成器的递归会在上端生成wirse位。+1。它甚至会给你一个函数,从一个范围生成一个数字。而不必麻烦地出错:-)在C++11中,你会想使用
library.@bames53同意使用
std::uniform\u int\u distribution
,就像我在回答中所做的那样,尤其是考虑到以下情况,这样做更有意义。
-10*u + (1-u)*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 ;
}