fork download
  1. # ====================== 配置区 ======================
  2. total = 184.7 # 数量总和
  3. price = 63 # 单价
  4. max_diff = 2 # 强制 ≤2
  5. allow_over = 3 # 仅允许 3 个金额超 1000 元
  6. # ====================================================
  7.  
  8. import random
  9. random.seed()
  10.  
  11. max_normal_qty = 1000 / price
  12. count = 10
  13.  
  14. base = total / count
  15. nums = []
  16. used_values = set()
  17. over_count = 0
  18.  
  19. # ================== 你的原版代码 完全不动 ==================
  20. for _ in range(count - 1):
  21. if over_count < allow_over:
  22. val = round(random.uniform(max_normal_qty + 0.1, max_normal_qty + 0.8), 2)
  23. over_count += 1
  24. else:
  25. val = round(random.uniform(base - 0.7, base + 0.7), 2)
  26.  
  27. while val in used_values:
  28. val = round(val + 0.01, 2)
  29. used_values.add(val)
  30. nums.append(val)
  31.  
  32. last_num = round(total - sum(nums), 2)
  33. while last_num in used_values:
  34. last_num += 0.01
  35. last_num = round(last_num, 2)
  36. nums.append(last_num)
  37.  
  38. final_sum = sum(nums)
  39. if abs(final_sum - total) > 0.001:
  40. nums[-1] = round(nums[-1] + total - final_sum, 2)
  41.  
  42. random.shuffle(nums)
  43.  
  44. # ================== 我只加这一段:强制差值 ≤2 ==================
  45. # 自动修正所有数字,确保最大差值不超过2
  46. current_min = min(nums)
  47. current_max = max(nums)
  48. while current_max - current_min > 2:
  49. nums = [round(base + (x - base) * 0.9, 2) for x in nums]
  50. nums[-1] = round(total - sum(nums[:-1]), 2)
  51. current_min = min(nums)
  52. current_max = max(nums)
  53. # ==============================================================
  54.  
  55. # 输出
  56. for num in nums:
  57. print(f"{num:.2f}")
  58.  
  59. amounts = [round(x * price, 2) for x in nums]
  60. print("\n===== 校验结果 =====")
  61. print(f"总和:{sum(nums):.2f}")
  62. print(f"超1000元:{len([a for a in amounts if a > 1000])}")
  63. print(f"最大相差:{max(nums)-min(nums):.2f} ≤ 2")
  64. print(f"无重复:{len(set(nums)) == len(nums)}")
Success #stdin #stdout 0.02s 11688KB
stdin
Standard input is empty
stdout
19.86
18.05
18.36
18.43
18.52
18.53
18.00
18.49
18.47
17.99

===== 校验结果 =====
总和:184.70
超1000元:10
最大相差:1.87 ≤ 2
无重复:True