问题:在具有特定平均值的两个值之间获取一组随机数。
假设我们得到 n 个介于 1 和 100 之间的随机数。我们的平均值为 25。
我的第一个方法是有 2 种模式,我们有 aboveMean 和 belowMean,其中第一个随机数是初始范围 1 和 100。每个后续数字都会检查总和。如果总和高于均值,我们转到 aboveMean 的情况,然后获得 1 到 25 之间的随机数。如果总和低于均值,我们执行 case belowMean 然后获得 26 到 100 之间的随机数。
除了粗略地获取随机数以将其添加到总数然后获取平均值之外,我还需要一些关于如何解决此问题的想法。如果它高于所讨论的均值,我们将得到一个低于均值的随机数,依此类推。虽然它确实有效,但似乎不是最好的方法。
我想我应该复习一下概率来处理这个随机数生成器。
让我们把范围分成左右两部分。使用与另一半的相对宽度相对应的频率的部分中的值。
int Leruce_rand(int min, int mean, int max) {
int r = rand()%(max - min + 1);
if (r < mean) {
// find number in right half
return rand()%(max - mean + 1) + mean;
} else {
// find number in left half
return rand()%(mean - min) + min;
}
假设 mean
是右半部分的一部分。这种快速解决方案可能存在小偏差。
给定 OP 的值,粗略地说,左半部分的平均值为 12.5,并且有 75% 的时间被调用。正确的平均数是 62.5,有 25% 的时间被调用:平均 25。
这种方法不同于 OP,后者“每个后续数字都将检查总和。如果总和高于平均值,我们将转到高于均值的情况,然后获得 1 到 25 之间的随机数。”因为这绝对可以防止出现一组高于或低于平均值的情况。使用 RNG,生成的值不应偏向于先前生成值的历史。