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

===== 校验结果 =====
总和:101.80
超1000元:0
最大相差:1.96 ≤ 2
无重复:True