不平衡随机数生成器
Unbalanced random number generator
我必须从升序数组中选择一个元素。元素越小越好。所以如果我从数组的开头选一个元素它就会被认为是更好的选择。但同时,我不希望选择是确定的,总是相同的元素。所以我要找
是一个随机数生成器,生成范围为[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)和一个将统一值映射到目标分布的函数
我现在要去城里了,但我回来后会记下来用图画写几个例子。
在这个相关问题(更多关于生成一个正常的伪随机数)中讨论了一些有价值的方法和思想
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 制作具有平均值的随机数生成器
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 尝试在 c++ 中创建随机数生成器并收到错误
- 存储并重新加载随机数生成器状态
- 作为随机数生成器的争用条件
- 问:Apache Arrow 数组生成器不安全追加
- 播种随机数生成器以使用分叉的好方法是什么?
- 随机数生成器的性能因平台而异
- OpenMP 和不平衡嵌套循环
- C++ 11 随机数生成不起作用
- 随机数生成器的种子和状态有什么区别?
- C++随机数生成器,不是随机的,但总是返回相同的数字
- 随机数生成器 (rand) 不是随机的?
- 种子随机数生成器不工作
- 不平衡随机数生成器
- 随机数生成器-不生成随机数每次
- c++ STL std::random_shuffle不能传递自定义随机数生成器
- 随机数生成器min和max-bounded,不工作
- 随机数生成器不会给我一个随机数