java – 在给定范围内生成总和为给定总和的N个随机数

前端之家收集整理的这篇文章主要介绍了java – 在给定范围内生成总和为给定总和的N个随机数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
第一次在Stackoverflow.我希望有人可以帮助我搜索一个算法.

我需要在给定的范围内生成N个随机数,总和到给定的数值!

例如:Generatare 3个数字,总和为11.

范围:

> 1到3之间的值.
> 5到8之间的值.
> 3到7之间的值.

这个例子的生成数字可以是:2,5,4.

我已经搜索了很多,找不到我需要的解决方案.

可以像这样生成像N个数字一样不变的模数:
generate random numbers of which the sum is constant
但是我无法做到这一点.

或者通过产生N个随机值,将它们相加,然后将常数和除以随机和,然后将每个随机数乘以该商G0001.

主要问题,为什么我不能采用这些解决方案是我的每个随机值都有不同的范围,我需要这些值与范围均匀分布(例如,在最小/最大值时不发生频率发生,如果我切断值其小于/大于最小/最大).

我也想到了一个soultion,取一个随机数(在该例子中,值为1,2或3),生成范围内的值(min / max或min之间),剩余的总和取决于哪个更小),减去我给定总和的数量,并保持一切,直到一切都分布.但是这将是可怕的无效.我真的可以使用算法的运行时间固定的方式.

我试图让它运行在Java.但是,该信息不是importend,除非有人已经有一个解决方案准备好了.所有我需要的是一个算法的描述或想法.

解决方法

首先,请注意,问题相当于:

Generate k numbers that sums to a number y,such that x_1,…,x_k –
each has a limit.

第二个可以通过简单地减少数字的下限来实现 – 所以在你的例子中,它相当于:

Generate 3 numbers such that x1 <= 2; x2 <= 3; x3 <= 4; x1+x2+x3 = 2

请注意,第二个问题可以通过各种方式解决,其中之一是:

生成每个元素的h_i重复列表 – 其中h_i是元素i的限制 – 重新排列列表,并选择第一个元素.

在你的例子中,列表是:[x1,x1,x2,x3,x3] – 洗牌并选择前两个元素.

(*)请注意,使用fisher-yates算法可以完成列表的混洗. (您可以在通过所需限制后中间中止算法).

原文链接:https://www.f2er.com/java/122111.html

猜你在找的Java相关文章