吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2441|回复: 8
收起左侧

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

  [复制链接]
surepj 发表于 2022-3-3 18:36
本帖最后由 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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
辛五味la + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

blackball9 发表于 2022-3-3 18:53
不错 不错 刚开始学就能用这么多
mason98 发表于 2022-3-3 19:15
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这也是个问题
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 08:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表