【问题标题】:Generating discrete uniform distribution in C在 C 中生成离散的均匀分布
【发布时间】:2015-11-02 03:51:39
【问题描述】:

我正在尝试在 C 中生成介于 0 和 1 之间的离散均匀分布。

通常您会期望: t = rand()%2 ,但这种方法似乎存在问题(它似乎与具有更多概率的较低位有关,尽管我对此不太了解)。

我尝试了一个在互联网上某处找到的技巧:

令 t1,t2 为 2 在 0 和 1 之间不那么均匀的分布,其中 1 的概率为 p,p 的概率为 (1-p)。然后我们取2个随机数:

t1 : p for 1, (1-p) for 0

t2 : p for 1, (1-p) for 0

如果 t1!=t2,我们有 (t1,t2)=(1,0) 和 (t1,t2) = (0,1) 相同的概率:p(1-p)。所以我们只是重复采样直到我们得到 t1!=t2 并且我们选择随机数 t = t1(这真的没关系)。这是我的代码:

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


int main()
{
/*
Declare variable to hold seconds on clock.
*/
int i,t1,t2,t;
time_t seconds;
seconds = time(NULL);

/*
Get value from system clock and
place in seconds variable.
*/
time(&seconds);
/*
Convert seconds to a unsigned
integer.
*/
srand((unsigned int) seconds);
/*
Output random values.
*/
    for (i =0; i < 10; ++i)
    {
        do
        {
            t1 = rand()%2;
            t2 = rand()%2;
        }
        while (t1==t2);
        t = t1;

        printf("%d\n",t);
    }
            /*printf("%d",rand()%2);
    printf("%d",rand()%2);*/

return 0;
}

我是对还是错?非常感谢!

【问题讨论】:

  • 您将需要了解rand 的实际问题,以了解为什么这不可能工作(与分发无关),但基本上:不要使用@ 987654324@.
  • rand()%2 的一个简单替代方案是rand() &gt; RAND_MAX / 2,它不会因最低位的低熵而受到偏差的影响。
  • 所以“0 和 1 之间的离散均匀分布”是指概率为 1/2 的 0 和概率为 1/2 的 1?

标签: c random


【解决方案1】:

永远不要使用rand()。使用random() 或者更好的generator from the PCG family。

对于任何一个,所有提供的位都是单独的。 random() 提供 31 个随机位。使用所有这些,而不是只使用一个。扔掉其他 30 个没有意义。例如

static inline int random_bit(void)
{
    static long val;
    static int bits = 0;
    int bit;

    if (bits == 0) {
        val = random();
        bits = 31;
    }
    bit = val & 1;
    val >>= 1;
    bits--;
    return bit;
}

【讨论】:

  • 抱歉,我不太了解您的解决方案。你能更详细地解释一下吗?非常感谢
  • 不,不是。这很简单。你应该简单地研究一下代码。
  • 那我试试看
【解决方案2】:

不保证内置随机数生成器rand() 具有您假设的特定分布(“p”和“1-p”的概率)。尽管rand() &gt; RAND_MAX / 2 更好,但它可能仍然没有特定的分布。最好使用here 中描述的任何其他方法。

话虽如此,如果您假设随机数生成器的 1 和 0 的概率是“p”和“1-p”,那么您为生成均匀分布所做的工作在数学上看起来是正确的,概率为 @987654324 @ 为 1 和 0 中的每一个,尽管您不愿意像在 cmets 中指出的那样使用它。

【讨论】:

  • 好的,我会为此找到另一个函数。但是如果 p 很大(大约 0.9),while 循环是否不太可能中断(因为 t1 =t2=1 的概率会比它们不同时大得多 0.9*09)我只是在猜测:P
  • @TruongTroll,你是对的。如果假设 p 为 1,则 p(1-p) 为 0,并且循环永远不会中断。但在数学上,您的解决方案仍然是一个统一的随机生成器,每个结果的概率为 0 :-)。
猜你喜欢
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2020-09-14
  • 2018-03-09
相关资源
最近更新 更多