本帖最后由 surepj 于 2022-3-3 19:07 编辑
Python的浮点数真是有点奇怪,
例如计算0.1+0.2,居然显示0.30000000000000004
在论坛看到有人需要一个能产生总和T,保留小数F位,N个随机数的程序或方法。
学习了半天,勉强用Python堆了一个。
欢迎大家交流学习。以便想出更好的方法
[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)
运行结果:
[Asm] 纯文本查看 复制代码 请输入生成的个数: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 |