簡體   English   中英

C程序中的概率隨機數,用於無鎖跳過列表的實現

[英]probabilistic random number in c program for lock free skip list implementation

我想生成一個隨機數,其中每個較高的數具有其前任概率的一半,即如果1出現4次2應該出現2次而三個應該出現1次,依此類推,編程語言必須為c

int getValue(int min,int max) {
    int i=0;
    while(i==0)
        i=rand()%max;
    int j=0;
    while(j==0) {
        printf("%d",j);
        j=rand()%i;
    }
    return j;
} 

可以使用以下功能:

int prioritizdRand(int min, int max)
{

    int result=min;
    int randNum=rand();
    long int start=RAND_MAX/2;

    while(randNum > start)
    {
        if(result> max )
        {
           return min;
        }
        result++;
        start= (start + RAND_MAX)/2;
    }

    return result;
}

我將從規范所要求的范圍開始(以后只需將min添加到隨機生成的數字):

int max_rnd = max - min;

然后生成范圍為1pow(2, max_rnd+1) - 1的均勻分布的隨機數

int rnd_limit = (1 << (max_rnd + 1)) - 1;
int rnd = (rand() % rnd_limit) + 1;

四舍五入生成的隨機數的以2為底的對數。 rnd的翻譯將遵循以下模式:

floor(log2(1)) -> 0
floor(log2(2)) -> 1
floor(log2(3)) -> 1
floor(log2(4)) -> 2
...
floor(log2(7)) -> 2
floor(log2(8)) -> 3
...
floor(log2(15)) -> 3
...

因此,結果的分布將與預期的結果相反(對於較大的數字,則為兩倍而不是一半),但這很容易更改。 有效地, floor(log2(rnd))是計算在最高1位的位置rnd ,因此它可以用一個位位移循環來實施:

int log2_rnd = 0;
while ((rnd >> log2_rnd) != 1)
{
    ++log2_rnd;
}

實際結果的時間:

return (max_rnd - log2_rnd) + min;

此處未涵蓋: rand() (特別是與模數結合rand()生成的“平均分布”數字的精度以及生成數字的上限。

一個簡單的想法:從值1開始,取一個隨機數,如果隨機數為奇數,則將值加1,右移一位,然后重復

unsigned randhalf()
{
    unsigned ret = 1;
    int rnd = rand();
    while (rnd&1)
    {
        ++ret;
        rnd >>= 1;
    }
    return ret;
}

或者,如果需要上下限:

int randhalf(int min, int max) // bounds are inclusive
{
    int ret = min;
    int rnd = rand();
    while (rnd&1 && ret<max)
    {
        ++ret;
        rnd >>= 1;
    }
    return ret;
}

無論rand()使用多少位,這只會提供大於min的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM