[英]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;
然后生成范圍為1
到pow(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.