# ====================== 配置区 ======================
total = 101.8 # 数量总和
price = 65.5 # 单价
max_diff = 2 # 强制 ≤2
allow_over = 3 # 仅允许 3 个金额超 1000 元
# ====================================================
import random
random.seed()
max_normal_qty = 1000 / price
count = 7
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)}")
IyA9PT09PT09PT09PT09PT09PT09PT09IOmFjee9ruWMuiA9PT09PT09PT09PT09PT09PT09PT09CnRvdGFsID0gIDEwMS44ICAgIyDmlbDph4/mgLvlkowKcHJpY2UgPSA2NS41ICAgICAgIyDljZXku7cKbWF4X2RpZmYgPSAyICAgICMg5by65Yi2IOKJpDIKYWxsb3dfb3ZlciA9IDMgICAgIyDku4XlhYHorrggMyDkuKrph5Hpop3otoUgMTAwMCDlhYMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgppbXBvcnQgcmFuZG9tCnJhbmRvbS5zZWVkKCkKCm1heF9ub3JtYWxfcXR5ID0gMTAwMCAvIHByaWNlCmNvdW50ID0gNwpiYXNlID0gdG90YWwgLyBjb3VudApudW1zID0gW10KdXNlZF92YWx1ZXMgPSBzZXQoKQpvdmVyX2NvdW50ID0gMAoKIyA9PT09PT09PT09PT09PT09PT0g5L2g55qE5Y6f54mI5Luj56CBIOWujOWFqOS4jeWKqCA9PT09PT09PT09PT09PT09PT0KZm9yIF8gaW4gcmFuZ2UoY291bnQgLSAxKToKICAgIGlmIG92ZXJfY291bnQgPCBhbGxvd19vdmVyOgogICAgICAgIHZhbCA9IHJvdW5kKHJhbmRvbS51bmlmb3JtKG1heF9ub3JtYWxfcXR5ICsgMC4xLCBtYXhfbm9ybWFsX3F0eSArIDAuOCksIDIpCiAgICAgICAgb3Zlcl9jb3VudCArPSAxCiAgICBlbHNlOgogICAgICAgIHZhbCA9IHJvdW5kKHJhbmRvbS51bmlmb3JtKGJhc2UgLSAwLjcsIGJhc2UgKyAwLjcpLCAyKQoKICAgIHdoaWxlIHZhbCBpbiB1c2VkX3ZhbHVlczoKICAgICAgICB2YWwgPSByb3VuZCh2YWwgKyAwLjAxLCAyKQogICAgdXNlZF92YWx1ZXMuYWRkKHZhbCkKICAgIG51bXMuYXBwZW5kKHZhbCkKCmxhc3RfbnVtID0gcm91bmQodG90YWwgLSBzdW0obnVtcyksIDIpCndoaWxlIGxhc3RfbnVtIGluIHVzZWRfdmFsdWVzOgogICAgbGFzdF9udW0gKz0gMC4wMQpsYXN0X251bSA9IHJvdW5kKGxhc3RfbnVtLCAyKQpudW1zLmFwcGVuZChsYXN0X251bSkKCmZpbmFsX3N1bSA9IHN1bShudW1zKQppZiBhYnMoZmluYWxfc3VtIC0gdG90YWwpID4gMC4wMDE6CiAgICBudW1zWy0xXSA9IHJvdW5kKG51bXNbLTFdICsgdG90YWwgLSBmaW5hbF9zdW0sIDIpCgpyYW5kb20uc2h1ZmZsZShudW1zKQoKIyA9PT09PT09PT09PT09PT09PT0g5oiR5Y+q5Yqg6L+Z5LiA5q6177ya5by65Yi25beu5YC8IOKJpDIgPT09PT09PT09PT09PT09PT09CiMg6Ieq5Yqo5L+u5q2j5omA5pyJ5pWw5a2X77yM56Gu5L+d5pyA5aSn5beu5YC85LiN6LaF6L+HMgpjdXJyZW50X21pbiA9IG1pbihudW1zKQpjdXJyZW50X21heCA9IG1heChudW1zKQp3aGlsZSBjdXJyZW50X21heCAtIGN1cnJlbnRfbWluID4gMjoKICAgIG51bXMgPSBbcm91bmQoYmFzZSArICh4IC0gYmFzZSkgKiAwLjksIDIpIGZvciB4IGluIG51bXNdCiAgICBudW1zWy0xXSA9IHJvdW5kKHRvdGFsIC0gc3VtKG51bXNbOi0xXSksIDIpCiAgICBjdXJyZW50X21pbiA9IG1pbihudW1zKQogICAgY3VycmVudF9tYXggPSBtYXgobnVtcykKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyDovpPlh7oKZm9yIG51bSBpbiBudW1zOgogICAgcHJpbnQoZiJ7bnVtOi4yZn0iKQoKYW1vdW50cyA9IFtyb3VuZCh4ICogcHJpY2UsIDIpIGZvciB4IGluIG51bXNdCnByaW50KCJcbj09PT09IOagoemqjOe7k+aenCA9PT09PSIpCnByaW50KGYi5oC75ZKM77yae3N1bShudW1zKTouMmZ9IikKcHJpbnQoZiLotoUxMDAw5YWD77yae2xlbihbYSBmb3IgYSBpbiBhbW91bnRzIGlmIGEgPiAxMDAwXSl9IikKcHJpbnQoZiLmnIDlpKfnm7jlt67vvJp7bWF4KG51bXMpLW1pbihudW1zKTouMmZ9IOKJpCAyIikKcHJpbnQoZiLml6Dph43lpI3vvJp7bGVuKHNldChudW1zKSkgPT0gbGVuKG51bXMpfSIp