生成加起来为1的随机数字列表
Generate random list of numbers that add up to 1
是否有任何STL函数允许创建一个随机数加起来为1的向量?理想情况下,这将取决于向量的大小,这样我就可以使向量的大小为23,这个函数将用0到1之间的随机数填充这23个元素,这些随机数加起来都是1。
一种选择是使用generate
用随机数填充向量,然后使用accumulate
对值求和,最后将向量中的所有值除以和,将和归一化为1。如图所示:
std::vector<double> vec(23);
std::generate(vec.begin(), vec.end(), /* some random source */);
const double total = std::accumulate(vec.begin(), vec.end(), 0.0);
for (double& value: vec) value /= total;
希望这能有所帮助!
没有,但您可以通过以下步骤轻松完成:
- 用随机浮点值填充向量,比如0到100
- 计算总和
- 将每个值除以总和
当然有很多标准函数可以生成随机数。为了实现规范化,您需要在生成所有数字后进行规范化。(例如,你可以生成数字,然后用它们的总和除以它们。)请注意,如果重要的话,在那一点上你可能不会得到均匀分布的数字。
这取决于您想要的随机数的分布类型。一种方法(在另一个答案中已经提出)是生成一些随机数,然后将它们除以它们的总和。
另一种方法是从区间[0,1)中随机列出一个数字列表,然后对它们进行排序。然后你可以取连续数字之间的差值(分别在列表的开头和结尾加0和1)。这些差值自然会加起来为1。举个例子,假设你选择了3个随机数,它们是:{0.38, 0.05, 0.96}
。让我们将0和1添加到此列表中,然后对其进行排序:
{0, 0.05, 0.38, 0.96, 1}
现在让我们来看看区别:
{0.05, 0.33, 0.58, 0.04}
如果你把这些加起来,它们的总和就是1。如果你不明白为什么这样做,想象一下你有一根长度为1的绳子,你用刀从绳子的末端随意切割一段距离(切割时不要将绳子分开)。很自然,所有的碎片加起来就是原来的长度。这正是这里发生的事情。
现在,就像我说的,这种方法会给你一个不同于除以和方法的随机数分布,所以不要认为它们是一样的!
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 在C++中随机生成 20 个非重复数字
- 为什么我C++得到这个随机的奇怪数字
- C++:创建1000次唯一的随机分布,在任何分布中都没有重复的数字
- 如何编写一个递归函数,以随机的方式混淆从0到6的数字
- 奇怪的数字随机出现在输出中.(C++)
- 生成随机长度的数字字符串
- 随机生成的输出中有多少位数字 1、2、3
- 生成随机字符/数字
- 在随机生成的数组中查找重复的连续数字
- C++ 制作一个随机数字/字母生成器,代码中有问题
- 随机生成数字无法正常工作
- 随机数字双重类型
- 试图从文件中获取随机数字的总和
- 生成加起来为1的随机数字列表
- c++随机数字总是相同的,即使时间(0)作为种子
- C++随机数字游戏,rand正在选择一个不是来自该集的数字
- 生成部分有序的随机数字列表