import random
import statistics
def generate_exact_split():
# 核心参数(严格锁定)
TARGET_SUM = 99462 # 总和必须精确等于此值
MULTIPLIER = 605
split_parts = 11 # 16份拆分值
MAX_PRODUCT = 10000 # 最大乘积不超过10000
MIN_PRODUCT = 6000 # 最小乘积不低于6000
precision = 1 # 1位小数
# 验证可行性
if split_parts * MIN_PRODUCT > TARGET_SUM or split_parts * MAX_PRODUCT < TARGET_SUM:
return f"无法拆分:16份需在[{split_parts*MIN_PRODUCT}, {split_parts*MAX_PRODUCT}]"
# 生成初始值(无规律,低重复)
split_values = []
value_counts = {}
while len(split_values) < split_parts:
max_val = round(MAX_PRODUCT / MULTIPLIER, precision) # 16.3
min_val = round(MIN_PRODUCT / MULTIPLIER, precision) # 9.8
val = round(random.uniform(min_val, max_val), precision)
# 检查乘积范围
product = round(val * MULTIPLIER)
if not (MIN_PRODUCT <= product <= MAX_PRODUCT):
continue
# 避免连续值(如x和x+0.1)
has_consecutive = False
for existing in split_values:
if 0.1 <= abs(val
- existing
) <= 0.2: has_consecutive = True
break
if has_consecutive:
continue
# 控制重复(最多2次)
if value_counts.get(val, 0) < 2:
split_values.append(val)
value_counts[val] = value_counts.get(val, 0) + 1
# 调整总和至精确目标值
products = [round(v * MULTIPLIER) for v in split_values]
diff = TARGET_SUM - sum(products)
# 优先调整只出现1次的值
single_indices = [i for i, v in enumerate(split_values) if value_counts[v] == 1]
random.shuffle(single_indices)
for i in single_indices:
if diff == 0:
break
step = 0.1 if diff > 0 else -0.1
new_val = round(split_values[i] + step, precision)
new_product = round(new_val * MULTIPLIER)
if (MIN_PRODUCT <= new_product <= MAX_PRODUCT and
value_counts.get(new_val, 0) < 2):
old_val = split_values[i]
value_counts[old_val] -= 1
if value_counts[old_val] == 0:
del value_counts[old_val]
split_values[i] = new_val
products[i] = new_product
value_counts[new_val] = value_counts.get(new_val, 0) + 1
diff = TARGET_SUM - sum(products)
# 改进的最终调整逻辑:分散调整多个值以确保总和正确
if diff != 0:
# 打乱顺序,使调整更均匀
indices = list(range(len(products)))
random.shuffle(indices)
for i in indices:
if diff == 0:
break
# 计算当前值可以调整的最大步长
current = products[i]
max_possible = MAX_PRODUCT - current
min_possible = MIN_PRODUCT - current
if diff > 0:
# 需要增加总和,取可能的最大值
step = min(diff, max_possible)
else:
# 需要减少总和,取可能的最小值
step = max(diff, min_possible)
if step != 0:
products[i] += step
split_values[i] = round(products[i] / MULTIPLIER, precision)
diff -= step
# 验证总和(必须正确)
final_sum = sum(products)
assert final_sum
== TARGET_SUM
, f
"总和错误:{final_sum}≠{TARGET_SUM}"
# 统计结果
value_counts = {v: split_values.count(v) for v in set(split_values)}
duplicates = [v for v, c in value_counts.items() if c == 2]
std_dev = round(statistics.stdev(split_values), 2)
# 输出(不排序)
output = [
"=== 拆分结果 ===",
"状态: ✅ 有效(总和精确匹配目标)",
f"重复情况: 共{len(duplicates)}个值各出现2次: {duplicates}",
f"分散度(标准差): {std_dev}",
f"总和验证: {final_sum} == {TARGET_SUM}",
" + ".join([f"{v}×{MULTIPLIER}={p}" for v, p in zip(split_values, products)]) + f" = {final_sum}",
f"拆分值(未排序): {split_values}"
]
return "\n".join(output)
# 直接运行
print(generate_exact_split())