不平衡随机数生成器

Unbalanced random number generator

本文关键字:随机数生成器 不平衡      更新时间:2023-10-16

我必须从升序数组中选择一个元素。元素越小越好。所以如果我从数组的开头选一个元素它就会被认为是更好的选择。但同时,我不希望选择是确定的,总是相同的元素。所以我要找

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

这是我的想法:

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

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

[0,n)之间生成一个随机数,例如x,然后在[0,1]之间生成另一个随机浮点数,例如y。然后取x的y次方,用底函数,你就会得到你的数字。

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

我想到的一个简单的临时方法是使用标准的随机生成器,但是使用重复的索引。在数组中:

0, 0, 0, 1, 1, 2, 3

更小的元素被占用的可能性更大。
我不知道你到底需要什么。您也可以定义自己的发行版,或者使用一些随机数生成库。但建议的方法是简单且易于配置的。
UPDATE2:你不需要显式地生成数组。对于大小为1000的数组,您可以从interval:[0,1000000]生成随机数,然后配置您自己的所选值分布:例如,较小的值(0-500)的间隔长度为1200,较大的值(500-1000)的间隔长度为800。这种方式的主要观点是,你可以很容易地配置概率,你不必重新实现随机数生成器。

使用适当的随机分布,例如指数分布的四舍五入结果。选择一个适合您需求的发行版,记录您使用的发行版,并找到一个不错的实现。如果可以选择GNU公共许可证下的代码,请使用优秀的GNU科学库(GSL),或者尝试Boost.Random.

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

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

2)和一个将统一值映射到目标分布的函数

我现在要去城里了,但我回来后会记下来用图画写几个例子。

在这个相关问题(更多关于生成一个正常的伪随机数)中讨论了一些有价值的方法和思想