# ====================== 配置区 ======================
total = 142.5 # 数量总和
price = 67 # 单价
max_diff = 2 # 强制 ≤2
allow_over = 3 # 仅允许 3 个金额超 1000 元
# ====================================================
import random
random.seed()
max_normal_qty = 1000 / price
count = 10
base = total / count
nums = []
used_values = set()
over_count = 0
# ================== 你的原版代码 完全不动 ==================
for _ in range(count - 1):
if over_count < allow_over:
val = round(random.uniform(max_normal_qty + 0.1, max_normal_qty + 0.8), 2)
over_count += 1
else:
val = round(random.uniform(base - 0.7, base + 0.7), 2)
while val in used_values:
val = round(val + 0.01, 2)
used_values.add(val)
nums.append(val)
last_num = round(total - sum(nums), 2)
while last_num in used_values:
last_num += 0.01
last_num = round(last_num, 2)
nums.append(last_num)
final_sum = sum(nums)
if abs(final_sum
- total
) > 0.001: nums[-1] = round(nums[-1] + total - final_sum, 2)
random.shuffle(nums)
# ================== 我只加这一段:强制差值 ≤2 ==================
# 自动修正所有数字,确保最大差值不超过2
current_min = min(nums)
current_max = max(nums)
while current_max - current_min > 2:
nums = [round(base + (x - base) * 0.9, 2) for x in nums]
nums[-1] = round(total - sum(nums[:-1]), 2)
current_min = min(nums)
current_max = max(nums)
# ==============================================================
# 输出
for num in nums:
print(f"{num:.2f}")
amounts = [round(x * price, 2) for x in nums]
print("\n===== 校验结果 =====")
print(f"总和:{sum(nums):.2f}")
print(f"超1000元:{len([a for a in amounts if a > 1000])}")
print(f"最大相差:{max(nums)-min(nums):.2f} ≤ 2")
print(f"无重复:{len(set(nums)) == len(nums)}")
IyA9PT09PT09PT09PT09PT09PT09PT09IOmFjee9ruWMuiA9PT09PT09PT09PT09PT09PT09PT09CnRvdGFsID0gIDE0Mi41ICAjIOaVsOmHj+aAu+WSjApwcmljZSA9IDY3ICAgICAgIyDljZXku7cKbWF4X2RpZmYgPSAyICAgICMg5by65Yi2IOKJpDIKYWxsb3dfb3ZlciA9IDMgICAgIyDku4XlhYHorrggMyDkuKrph5Hpop3otoUgMTAwMCDlhYMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgppbXBvcnQgcmFuZG9tCnJhbmRvbS5zZWVkKCkKCm1heF9ub3JtYWxfcXR5ID0gMTAwMCAvIHByaWNlCmNvdW50ID0gMTAKYmFzZSA9IHRvdGFsIC8gY291bnQKbnVtcyA9IFtdCnVzZWRfdmFsdWVzID0gc2V0KCkKb3Zlcl9jb3VudCA9IDAKCiMgPT09PT09PT09PT09PT09PT09IOS9oOeahOWOn+eJiOS7o+eggSDlrozlhajkuI3liqggPT09PT09PT09PT09PT09PT09CmZvciBfIGluIHJhbmdlKGNvdW50IC0gMSk6CiAgICBpZiBvdmVyX2NvdW50IDwgYWxsb3dfb3ZlcjoKICAgICAgICB2YWwgPSByb3VuZChyYW5kb20udW5pZm9ybShtYXhfbm9ybWFsX3F0eSArIDAuMSwgbWF4X25vcm1hbF9xdHkgKyAwLjgpLCAyKQogICAgICAgIG92ZXJfY291bnQgKz0gMQogICAgZWxzZToKICAgICAgICB2YWwgPSByb3VuZChyYW5kb20udW5pZm9ybShiYXNlIC0gMC43LCBiYXNlICsgMC43KSwgMikKCiAgICB3aGlsZSB2YWwgaW4gdXNlZF92YWx1ZXM6CiAgICAgICAgdmFsID0gcm91bmQodmFsICsgMC4wMSwgMikKICAgIHVzZWRfdmFsdWVzLmFkZCh2YWwpCiAgICBudW1zLmFwcGVuZCh2YWwpCgpsYXN0X251bSA9IHJvdW5kKHRvdGFsIC0gc3VtKG51bXMpLCAyKQp3aGlsZSBsYXN0X251bSBpbiB1c2VkX3ZhbHVlczoKICAgIGxhc3RfbnVtICs9IDAuMDEKbGFzdF9udW0gPSByb3VuZChsYXN0X251bSwgMikKbnVtcy5hcHBlbmQobGFzdF9udW0pCgpmaW5hbF9zdW0gPSBzdW0obnVtcykKaWYgYWJzKGZpbmFsX3N1bSAtIHRvdGFsKSA+IDAuMDAxOgogICAgbnVtc1stMV0gPSByb3VuZChudW1zWy0xXSArIHRvdGFsIC0gZmluYWxfc3VtLCAyKQoKcmFuZG9tLnNodWZmbGUobnVtcykKCiMgPT09PT09PT09PT09PT09PT09IOaIkeWPquWKoOi/meS4gOaute+8muW8uuWItuW3ruWAvCDiiaQyID09PT09PT09PT09PT09PT09PQojIOiHquWKqOS/ruato+aJgOacieaVsOWtl++8jOehruS/neacgOWkp+W3ruWAvOS4jei2hei/hzIKY3VycmVudF9taW4gPSBtaW4obnVtcykKY3VycmVudF9tYXggPSBtYXgobnVtcykKd2hpbGUgY3VycmVudF9tYXggLSBjdXJyZW50X21pbiA+IDI6CiAgICBudW1zID0gW3JvdW5kKGJhc2UgKyAoeCAtIGJhc2UpICogMC45LCAyKSBmb3IgeCBpbiBudW1zXQogICAgbnVtc1stMV0gPSByb3VuZCh0b3RhbCAtIHN1bShudW1zWzotMV0pLCAyKQogICAgY3VycmVudF9taW4gPSBtaW4obnVtcykKICAgIGN1cnJlbnRfbWF4ID0gbWF4KG51bXMpCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMg6L6T5Ye6CmZvciBudW0gaW4gbnVtczoKICAgIHByaW50KGYie251bTouMmZ9IikKCmFtb3VudHMgPSBbcm91bmQoeCAqIHByaWNlLCAyKSBmb3IgeCBpbiBudW1zXQpwcmludCgiXG49PT09PSDmoKHpqoznu5PmnpwgPT09PT0iKQpwcmludChmIuaAu+WSjO+8mntzdW0obnVtcyk6LjJmfSIpCnByaW50KGYi6LaFMTAwMOWFg++8mntsZW4oW2EgZm9yIGEgaW4gYW1vdW50cyBpZiBhID4gMTAwMF0pfSIpCnByaW50KGYi5pyA5aSn55u45beu77yae21heChudW1zKS1taW4obnVtcyk6LjJmfSDiiaQgMiIpCnByaW50KGYi5peg6YeN5aSN77yae2xlbihzZXQobnVtcykpID09IGxlbihudW1zKX0iKQ==