不平衡随机数发生器

时间:2011-12-13 07:50:16

标签: c++ c random

我必须从升序数组中选择一个元素。较小的元素被认为更好。因此,如果我从数组的开头选择一个元素,它被认为是更好的选择。但与此同时,我不希望选择是确定性的,总是相同的元素。所以我在寻找

  

随机数生成器,它生成范围为[0,n]的数字,但是   数字越小,产生的机会就越大。

我想到了这一点:

num = n;
while(/*the more iteration the more chance for smaller numbers*/)
  num = rand()%num;

我想知道是否有人有更好的解决方案 我确实看过一些类似的问题,但他们一般都有关于随机数生成的详细信息。我正在寻找这种特定类型的随机数生成的解决方案,无论是算法还是提供它的库。

4 个答案:

答案 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
很可能会采取较小的元素。
我不确切地知道你需要什么。您也可以定义自己的发行版或使用一些随机数生成库。但建议的方法很简单,易于配置 UPDATE2:您不必显式生成数组。对于大小为1000的数组,您可以从间隔:[0,1000000]生成随机数,然后配置您自己的选定值分布:例如,较小值(0-500)的长度间隔为1200,较大的间隔长度为800 (500-1000)。这样一来,您可以轻松配置概率,而不必重新实现随机数生成器。

答案 2 :(得分:1)

使用适当的随机分布,例如exponential distribution的舍入结果。选择一个符合您需求的分发,记录您使用的分发,并找到一个很好的实现。如果GNU公共许可证下的代码是一个选项,请使用优秀的GNU科学库(GSL),或尝试Boost.Random。

答案 3 :(得分:1)

两个工具将解决许多随机​​分配需求

1)你有一个统一的随机数发生器

2)以及将统一值映射到目标分布上的函数

我现在必须前往这个城市,但是当我回来时,我会注意写一些带有绘图的例子。

related question中讨论了一些有价值的方法和想法(更多关于生成普通伪随机数)