我必须从升序数组中选择一个元素。较小的元素被认为更好。因此,如果我从数组的开头选择一个元素,它被认为是更好的选择。但与此同时,我不希望选择是确定性的,总是相同的元素。所以我在寻找
随机数生成器,它生成范围为[0,n]的数字,但是 数字越小,产生的机会就越大。
我想到了这一点:
num = n;
while(/*the more iteration the more chance for smaller numbers*/)
num = rand()%num;
我想知道是否有人有更好的解决方案 我确实看过一些类似的问题,但他们一般都有关于随机数生成的详细信息。我正在寻找这种特定类型的随机数生成的解决方案,无论是算法还是提供它的库。
答案 0 :(得分:3)
在x
之间生成一个随机数,比如说[0,n)
,然后在y
之间生成另一个随机浮点数,比如[0,1]
。然后将x提升到y的幂并使用floor功能,你将获得你的号码。
int cust(int n)
{
int x;
double y, temp;
x = rand() % n;
y = (double)rand()/(double)RAND_MAX;
temp = pow((double) x, y);
temp = floor(temp);
return (int)temp;
}
更新:以下是调用上述函数10次的示例结果,n = 10,20和30。
2 5 1 0 1 0 1 4 1 0
1 2 4 1 1 2 3 5 17 6
1 19 2 1 2 20 5 1 6 6
答案 1 :(得分:3)
我想到的简单的临时方法是使用标准随机生成器,但重复索引。所以在数组中:
0, 0, 0, 1, 1, 2, 3
很可能会采取较小的元素。答案 2 :(得分:1)
使用适当的随机分布,例如exponential distribution的舍入结果。选择一个符合您需求的分发,记录您使用的分发,并找到一个很好的实现。如果GNU公共许可证下的代码是一个选项,请使用优秀的GNU科学库(GSL),或尝试Boost.Random。
答案 3 :(得分:1)
1)你有一个统一的随机数发生器
2)以及将统一值映射到目标分布上的函数
我现在必须前往这个城市,但是当我回来时,我会注意写一些带有绘图的例子。
本related question中讨论了一些有价值的方法和想法(更多关于生成普通伪随机数)