surepj 发表于 2022-3-3 18:36

【Python】-[初学笔记]-产生总和T,保留小数F位,N个随机数。

本帖最后由 surepj 于 2022-3-3 19:07 编辑

Python的浮点数真是有点奇怪,
例如计算0.1+0.2,居然显示0.30000000000000004
在论坛看到有人需要一个能产生总和T,保留小数F位,N个随机数的程序或方法。
学习了半天,勉强用Python堆了一个。
欢迎大家交流学习。以便想出更好的方法

import numpy

n = int(input('请输入生成的个数:'))
total = eval(input('请输入总和:'))
float_count = int(input('请输入保留几位小数:'))
rang1 = total / n - 2# 产生的数在均数向下浮动的范围
rang2 = total / n + 2# 产生的数在均数向上浮动的范围
rdm_nums = numpy.random.rand(n) * (rang2 - rang1) + rang1# 随机产生n个一定范围内的浮点数numpy类型列表
# print(rdm_nums)
ratio = sum(rdm_nums) / total# 用随机产生的浮点数列表内总和,除以总和,得到一个比率
# print(ratio)
all_nums = numpy.around((rdm_nums / ratio), decimals=float_count)   # 用随机产生n个浮点数列表,除以比率,得到一个初步的个数为n,总和为total的numpy类型列表
all_nums = all_nums.tolist() # 转成普通列表类型
del all_nums[-1]# 去掉列表最后一位
all_nums.append(round((total - sum(all_nums)), float_count))# 用总和减去不包含最后一位列表的和,来替换最后一位,主要是因为Python浮点数的精度问题
print(f'共生成{n}个随机数,其总和为{total},结果如下:')
for i in all_nums:
    print(i)

运行结果:
请输入生成的个数:16
请输入总和:88
请输入保留几位小数:3
共生成16个随机数,其总和为88,结果如下:
3.653
6.351
3.966
3.878
6.467
6.209
5.364
5.285
5.011
4.458
7.141
7.147
7.153
5.023
6.453
4.441

blackball9 发表于 2022-3-3 18:53

不错 不错 刚开始学就能用这么多

mason98 发表于 2022-3-3 19:15

用random.sample就可以

cyfwapj 发表于 2022-3-3 20:59

理解能力强👍

CCQc 发表于 2022-3-4 00:16

感谢分享

king100 发表于 2022-3-4 00:18

感谢分享

小丑恶人 发表于 2022-3-4 00:21

谢谢楼主分享,学到了

ID一VerNe 发表于 2022-3-4 08:08

0.2没法用精确的二进制数来表示,所以后面会带有个4这样

surepj 发表于 2022-3-4 08:44

ID一VerNe 发表于 2022-3-4 08:08
0.2没法用精确的二进制数来表示,所以后面会带有个4这样

是啊,但Python这也是个问题
页: [1]
查看完整版本: 【Python】-[初学笔记]-产生总和T,保留小数F位,N个随机数。