相关疑难解决方法(0)

非偏差返回n个随机正数(> = 0)的列表,以便它们的总和== total_sum

我正在寻找一种算法或建议来改进我的代码,以生成一个随机数列表,其总和等于某个任意数.使用我的代码,它总是有偏见,因为第一个数字往往会更高.

有没有办法让数字选择更有效率?

#!/usr/bin/python
'''
  Generate a list of 'numbs' positive random numbers whose sum = 'limit_sum'
'''

import random


def gen_list(numbs, limit_sum):
  my_sum = []
  for index in range(0, numbs):
    if index == numbs - 1:
      my_sum.append(limit_sum - sum(my_sum))
    else:
      my_sum.append(random.uniform(0, limit_sum - sum(my_sum)))

  return my_sum

#test
import pprint
pprint.pprint(gen_list(5, 20))
pprint.pprint(gen_list(10, 200))
pprint.pprint(gen_list(0, 30))
pprint.pprint(gen_list(1, 10))
Run Code Online (Sandbox Code Playgroud)

输出

## output

[0.10845093828525609,
 16.324799712999706,
 0.08200162072303821,
 3.4534885160590041,
 0.031259211932997744]

[133.19609626532952,
 47.464880208741029,
 8.556082341110228,
 5.7817325913462323,
 4.6342577008233716,
 0.22532341156764768,
 0.0027495225618908918,
 0.064738336208217895,
 0.028888697891734455,
 0.045250924420116689]

[]

[10]
Run Code Online (Sandbox Code Playgroud)

python algorithm

14
推荐指数
4
解决办法
2195
查看次数

用新的随机生成的值替换数组中的重复值

我有一个函数(来自之前没有回答的问题),它创建了一个包含n个值的数组.数组的总和等于$ max.

function randomDistinctPartition($n, $max) {
  $partition= array();
  for ($i = 1; $i < $n; $i++) {
    $maxSingleNumber = $max - $n;
    $partition[] = $number = rand(1, $maxSingleNumber);
    $max -= $number;
  }
  $partition[] = $max;
  return $partition;
}
Run Code Online (Sandbox Code Playgroud)

例如:如果我设置$ n = 4和$ max = 30.那么我应该得到以下内容.

array(5, 7, 10, 8);
Run Code Online (Sandbox Code Playgroud)

但是,此功能不考虑重复项和0.我想要 - 并且一直在努力完成 - 是生成一个具有唯一数字的数组,这些数字加起来我的预定变量$ max.没有重复的数字,没有0和/或负整数.

php algorithm combinatorics data-partitioning

5
推荐指数
1
解决办法
1073
查看次数