【问题标题】:how to get random number between 5 and -5 in c++如何在c ++中获取5到-5之间的随机数
【发布时间】:2018-05-22 17:21:26
【问题描述】:

我正在尝试使用rand % (5 -5) 获取随机数,它给出了除以零的错误

#include <iostream>
using namespace std;
int main()
{
int A[20];
for (int i-=0 ;i<20;i++)
 A[i]= rand() % -5;

system("pause")
return 0;
}

【问题讨论】:

  • 这个问题并不完全是重复的,但请参阅this answer
  • 你检查过 rand 返回的值吗?
  • 还有relevant - 可能重复
  • 不确定你是如何通过零错误获得一个部门的,但for (int i-0 ;i&lt;20;i++) 不正确。
  • 您现在拥有for (int i-=0 ;i&lt;20;i++),但仍然不正确。那是你真正拥有的吗?

标签: c++ random


【解决方案1】:

只需使用std::uniform_int_distribution

产生随机整数值 i,均匀分布在闭区间 [a, b]...

std::random_device rd;  //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> dis(-5, 5);
std::cout << dis(gen) << std::endl;

live example

【讨论】:

    【解决方案2】:

    使用新的随机库

    #include <random>
    
    // Seed with a real random value, if available
    std::random_device r;
    std::default_random_engine e1(r()); 
    // A random number between - 5 and 5
    std::uniform_int_distribution<int> uniform_dist(-5, 5);
    
    int nextRandom()
    {
        return uniform_dist(e1);
    }
    

    叫什么:

    int r = nextRandom();
    

    您也可以创建通用版本:

    template< int low, int high >
    int nextRandom()
    {
        static_assert( low < high, "low must be < high" );
    
        // Seed with a real random value, if available
        static std::random_device         r;
        static std::default_random_engine e1( r() );
        // A random number between low and high
        static std::uniform_int_distribution< int > uniform_dist( low, high );
    
        return uniform_dist( e1 );
    }
    

    叫什么:

    int random = nextRandom< -5, 5 >();
    

    【讨论】:

      【解决方案3】:

      rand 返回:

      ​0​和 RAND_MAX(包括 0 和 RAND_MAX)之间的伪随机整数值。

      要从范围 [-5, .., 5](含)中获取值,您必须从范围 [0, .., RAND_MAX] 中计算它。

      在 [-5, .., 5] 范围内有 11 个值 [-5, .., -1, 0, 1, .., 5]。

      从(包括)0开始,计数11个值,最终数字为10。

      要从更大的范围返回值 [0, .., 10],可以使用 mod。但是您需要在结果中使用 10,因此必须使用 mod 11。

      现在要从范围 [0, .., 10] 中获取范围 [-5, .., 5] 的值,您需要减去 5。

      const int val_from_rand = rand();
      const int range_0_10 = val_from_rand % 11;
      const int random_val = range_0_10 - 5;
      

      【讨论】:

        【解决方案4】:

        您在system("pause") 之后忘记了;。 除此之外,您离解决方案也不远了。

        但是阅读reference 你会发现%5 会返回0 到4 之间的数字,而%-5 没有任何意义。

        您可以返回 0 到 10(包括 10)之间的数字,然后通过减去 -5 将其缩小:

        #include <iostream>
        #include <stdlib.h>
        using namespace std;
        int main()
        {
            int a[20];
            for (int i=0; i<20; i++)
                a[i] = (rand() % 11)-5; //use %10 if you do not want 5 as apossible outcome
            system("pause");
            return 0;
        }
        

        这是最简单且最接近您的解决方案的方法。

        请不要对变量使用大写字母,除非它们是常量。

        【讨论】:

          【解决方案5】:

          你可以试试这段代码

          `

          #include <stdlib.h>
          #include <time.h>
          
          int main()
          {
             int number = 0;
          
             srand(time(NULL));
          
             do
             {
                number = rand();
             }while(number > 5);
          
          return 0;
          }
          

          `

          【讨论】:

          • 我不知道谁赞成这个,但不应该。这个答案不会做问题所要求的,并试图以一种非常低效的方式这样做。
          • @FrançoisAndrieux 这个赞成票也让我大吃一惊。这是您可以要求获得随机数的最糟糕的方式,它甚至无法在正确的范围内获得它。 :(
          • 我正在尝试获取介于 5 和 -5 之间的负值和正值
          • @Frank 不,它得到一个介于 0 和 5 之间的数字。INT_MIN 是一个负数。
          猜你喜欢
          • 1970-01-01
          • 2012-01-01
          • 2015-08-15
          • 1970-01-01
          • 2020-02-23
          • 2015-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多