【问题标题】:Output Random Number in range when using rand()使用 rand() 时输出范围内的随机数
【发布时间】:2018-03-29 16:43:07
【问题描述】:

我的具体问题是当我输入 90 作为 lower 值和 100 作为 higher 值的范围时,我得到的输出随机数有时小于 90.@987654322 @ 我的代码是:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define Null 0

void main(){
    int x,y,a,b;
    printf("Insert two numbers to create a range\n in which you want a random number to be generated:\n");
    scanf("%d%d",&x,&y);
    srand(time(Null));
    a =( rand() + x)%y ;
    printf("The Randomly Generated Number is %d.\n",a);


}

【问题讨论】:

标签: c random


【解决方案1】:

假设您想要一个独占的上限,正确的做法是:

(rand() % (high - low)) + low

假设 high=100 和 low=90,了解其工作原理:

  • 你生成一个随机整数
  • (high - low) 为您提供范围,100 - 90 = 10。
  • 当您按 10 % 计算时,您将获得 [0, 10) 范围内的结果,因此它将是 0、1、2、3、4、5、6、7、8 或9
  • 由于您真正想要的是 90、91、92、...、99 之一,因此您必须将 low 添加回它

这里要注意的是,你只会得到 [90, 99]。如果你想有一个 inclusive 上限所以 [90, 100] 那么你想在你修改的数量上加 1

(rand() % (high + 1 - low)) + low

【讨论】:

    【解决方案2】:

    你必须使用这个公式来排除 y ( a in [x , y[ ):

    a = (rand() % (y - x)) + x;
    

    这个包含 y ( a in [x , y] ):

    a = (rand() % (y - x + 1)) + x;
    

    【讨论】:

      【解决方案3】:

      编辑: 应该是:

      if (x == y) a = x
      else a = (rand() % (y - x)) + x
      

      【讨论】:

      • 陷阱:当x == y。应该是a = (rand() % (y - x + 1)) + x
      • 您是说if (x == y) a = x; 吗?
      【解决方案4】:

      假设您想要一个实际的随机分布... 伪码

      range = high - low
      r = rand()
      while (r > range)
      {
          r=rand();
      }
      r+=low;
      

      类似的东西应该通过拒绝超出范围的东西来给你一个均匀的分布,因为使用mod n没有一个n的所有值在rand的域上的均匀分布(0RAND_MAX这是@ 987654325@ 在我的 C 库上)。

      让我们使用 0xf 作为域的人为示例:

      如果您对范围内的每个值都执行rand() % 10... 然后你得到: 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5。其中 0,1,2,3,4,5 是 6,7,7,8,9 的 2*...

      通过转到更大的域,您可以获得更平滑的分布,但如果您不通过干净地划分 RAND_MAX+1 的东西进行修改,它总是会变得粗糙

      取决于您正在处理的数字以及 rand 的速度有多快,您可以执行类似上面的简单操作,或者您可以丢弃大于除数的最大数字以上的内容...所以如果您要除法,请丢弃 0x7FFFFFF8 以上的所有内容10 以消除偏见。

      【讨论】:

        猜你喜欢
        • 2014-06-24
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        相关资源
        最近更新 更多