请教一个问题,生成 10 个随机数 [0,100] 且最终 10 个随机数之和为 100 , 用 Python 如何实现

2019-01-20 21:51:47 +08:00
 commoccoom
26029 次点击
所在节点    Python
167 条回复
werty
2019-01-21 09:21:57 +08:00
网上有微信红包算法, 抄一遍就行了,
alex1504
2019-01-21 09:22:08 +08:00
@celeron533 思路不错
bigbigfly
2019-01-21 09:30:24 +08:00
组合数学里的整数拆分了解下,思路:先有一个 1 行 100 列的数组,每个值为 1 ;再随机生成 100 内的 9 个数(升序排列),这样,每个间隔(如 0-随机生成的 9 个数中最小的那个,依次类推会一般有十个间隔)累加起来当做一个值,个人感觉这样很合理,很随机。
jrient
2019-01-21 09:31:24 +08:00
其实题主的问题有两个分支:
1. 直接获得 10 个数字
2. 每次生成一个,一共生成 10 个数字
hanwujibaby
2019-01-21 09:35:08 +08:00
@celeron533 学习了。这是数学思维啊。
SeaRecluse
2019-01-21 09:35:11 +08:00
import random
num_list = []
tmp_num = 0
tmp_sum = 0
get_num = 0

for i in range(1,10):
tmp_sum = i * 10 - get_num
tmp_num = random.randint(1,tmp_sum)
get_num += tmp_num
num_list.append(tmp_num)

num_list.append(100 - get_num)
print(num_list)
PALELESS
2019-01-21 09:39:31 +08:00
先定义一个生成两个数的过程, 并给出总和
第一个数为随机
第二个数为和减去第一个数
返回这两个数

那么 10 个数即为:
PALELESS
2019-01-21 09:42:36 +08:00
先定义一个生成两个数的过程, 参数为其和
第一个数为随机
第二个数为和减去第一个数
返回这两个数

那么 10 个数即为: 求出第一个随机数, 第二个数为第一个数减去第一个数, 用第二个数作为和接着递归

不给代码了(空格按错多回了一次)
lithiumii
2019-01-21 09:42:49 +08:00
比较看脸的算法,供参考(滑稽

from random import randint
sum_ints = 0
while sum_ints != 100:
ints = [randint(0,100) for ii in range(0,10)]
sum_ints = sum(ints)
print(ints)
fromxt
2019-01-21 09:44:32 +08:00
如果是要均匀分布随机数的话,可以采用 numpy 库里面的狄利克雷分布函数 numpy.random.dirichlet,这个函数能保证随机数是正的,和为 1.
参考 https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.dirichlet.html

import numpy as np
np.random.dirichlet(np.ones(10))*100
nicking
2019-01-21 09:47:22 +08:00
@jssyxzy 那万一那九个数相加已经大于 100 了呢
xxlong
2019-01-21 09:58:11 +08:00
@JCZ2MkKb5S8ZX9pq 算法有问题 出现了 0 的时候
我觉得算法还是生成随机数后,用可控总和去减比较稳妥,因为不可能做到完全随机,如果第一个或者有一个随机数是 99 怎么办?我觉得这样比较稳妥:先生成 0~( 100-10 )的随机数 a,然后再生成 0~( a-10 )的随机数,最后一个用综合减去,这样能保证稳妥的随机性
SunnyFeng
2019-01-21 09:59:57 +08:00
@jssyxzy 如果第 10 个数用 100 -的话,那有可能这个数是负数吧?
SeaRecluse
2019-01-21 10:00:10 +08:00
@SeaRecluse 写错了,是 i*11
xinClever
2019-01-21 10:14:37 +08:00
num1 = [0, 100],num2 = [0, 100 - num1],num3 = [0, 100 - num1 - num2],以此类推,可以吧?
celeron533
2019-01-21 10:16:15 +08:00
@commoccoom 但实际上最可操作的还是取一堆介于 0-1 之间的浮点 /单精 /双精,然后把它们相加,最后总和与 100 等比放大。这个之前#2 @alvin666 操作过了
beforeuwait
2019-01-21 10:18:34 +08:00
3 楼正解
huahuajun9527
2019-01-21 10:24:26 +08:00
照 3 楼说的

import random


a = [random.randint(0, 100) for i in range(10)]
a.append(0)
a.append(100)
a.sort()

b = [a[i + 1] - a[i] for i in range(10 + 1)]

print(b)
print(sum(b))
huahuajun9527
2019-01-21 10:28:00 +08:00
@huahuajun9527 数字取多了,写成取 11 个数了==
dlrdegk
2019-01-21 10:32:59 +08:00
@celeron533 #3 看到这个第一反应:《几何原本》

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/528903

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX