use*_*974 11 java random algorithm
第一次来到Stackoverflow.我希望有人可以帮助我搜索算法.
我需要在给定范围内生成N个随机数,总计达到给定的总和!
例如:Generatare 3总计11的数字.
范围:
此考试的生成数字可以是:2,5,4.
我已经搜索了很多,无法找到我需要的解决方案.
有可能像这样生成类似于N个常数和unsing模数的数: 产生随机数,其中和是常数 但是我无法用范围完成.
或者通过生成N个随机值,将它们相加,然后将常数和除以随机和,然后将每个随机数乘以此处提出的商.
主要问题,为什么我不能采用这些解决方案是我的每个随机值都有不同的范围,我需要使用范围均匀分布值(例如,没有频率出现在最小值/最大值,如果我切断值,则会发生这种情况它小于/大于最小/最大值).
我还想到了一个灵魂,取一个随机数(在那个例子中,值1,2或3),生成该范围内的值(在最小值/最大值或最小值与其余值之间,取决于哪个更小) ),减去我给定金额的数量,并保持这一点,直到一切都分配完毕.但那将是非常无效的.我真的可以使用一种修复算法运行时的方法.
我正试着用Java运行.但是那个Info不是那个importend,除非有人已经准备好了解决方案.我只需要一个算法的描述或想法.
首先,请注意问题相当于:
生成总和为y的k个数,使得x_1,...,x_k - 每个都有一个限制.
第二个可以通过简单地减少数字的下限来实现 - 所以在你的例子中,它相当于:
生成3个数字,使x1 <= 2; x2 <= 3; x3 <= 4; x1 + x2 + x3 = 2
请注意,第二个问题可以通过各种方式解决,其中之一是:
生成一个包含h_i
每个元素重复的列表- 其中h_i
是元素的限制i
- 对列表进行洗牌,然后选择第一个元素.
在您的示例中,列表是:[x1,x1,x2,x2,x2,x3,x3,x3,x3]
- 随机播放它并选择前两个元素.
(*)注意,可以使用fisher-yates算法来对列表进行混洗.(您可以在超过所需限制后中止算法).
添加最小值.在这种情况下,1 + 5 + 3 = 9
11 - 9 = 2,所以你必须在三个数字之间分配2(例如:+ 2,+ 0,+ 0或+ 0,+ 1,+ 1).
我将剩下的部分留给您,在此转换后创建统一分布相对容易.
归档时间: |
|
查看次数: |
2764 次 |
最近记录: |