【问题标题】:Picking random number between two points in C在C中的两点之间选择随机数
【发布时间】:2012-03-05 18:16:05
【问题描述】:

我想知道,是否可以在 c 的两个限制之间生成一个随机数。 IE。我的程序是这样设置的:

function x
{
    generate random number;
}

while(1)
{
    function x;
    delay
}

所以基本上我希望在每次调用函数时生成一个随机数,但该数字必须介于例如 100 和 800 之间

我知道stdlib.h 中已经有一个名为 random 和 randmize 的函数 我只是不知道如何创建上限和下限

谢谢

【问题讨论】:

    标签: c random


    【解决方案1】:

    首先,不要忘记播种您的 PRNG 一次且仅一次

    srand(time(NULL));
    

    那么,这个函数应该做你想做的事。
    (经过轻微测试,似乎可以工作)

    int RandRange(int Min, int Max)
    {
        int diff = Max-Min;
        return (int) (((double)(diff+1)/RAND_MAX) * rand() + Min);
    }
    

    在你的情况下,你会想要:

    x = RandRange(100, 800);  /* x will be between 100 and 800, inclusive */
    

    这使用浮点数学,它可能比模 (%) 算法慢,但偏差较小。

    【讨论】:

    • 有没有办法在不使用 sran 和 rand 函数的情况下生成两个限制之间的数字
    • 我有一个 while (1)(超级循环),它每 10 ms 秒调用一个函数。
    • 如果要随机数,就得使用rand(),或者自己写PRNG。
    【解决方案2】:

    首先获取一个介于 0 和 1 之间的随机数(R)。然后将其缩放到所需范围 (R* (right limit - left limit))。然后添加所需的最小值。

    int rand_between(int l, int r) {
      return (int)( (rand() / (RAND_MAX * 1.0f)) * (r - l) + l);
    }
    

    【讨论】:

      【解决方案3】:

      查看模运算符。

      int r = rand();
      r = (r % 700) + 100;
      

      700 是范围的差值。

      【讨论】:

      • 模数可能会生成有偏差的随机数,因为范围可能包含非均匀模数映射。
      • 如果是这样,我相信生成器已经有偏见并且很糟糕。使情况变得更糟是好是坏是有争议的,因为使情况变得更糟会增加发现和改进的可能性。
      • @perreal 有更好的答案。为了清楚起见,我发布了这个。我不知道张贴者打算如何使用答案。足够好可能就足够了。
      • @Joe:生成器可以是完美的,模数仍然会产生偏差。考虑一个非常简单的情况,其中 RAND_MAX = 10,然后你做一个模 3。通过完美的分布,你会得到 40% 的零,40% 的一,只有 30% 的二,因此:在这个中对二(2)的偏差简单的案例。大数字更难看出偏差,但它仍然存在。
      • @abelenky 是的,我的错误。我承认我自己更担心算法。如果我有能力设置 rand_max,我就不会使用 mod;并且正常的 RAND_MAX 被指定为:'此值取决于库,但至少被授予 32767。'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 2011-07-14
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多