
本文介绍如何在打印二维字符阵列时,让每行中星号“”的数量随行号增加而线性减少,并确保每行的星号位置随机分布。
本文介绍如何在打印二维字符阵列时,让每行中星号“*”的数量随行号增加而线性减少,并确保每行的星号位置随机分布。
要实现“每行星号数量逐行递减”的效果,关键在于:不再对每个单元格独立掷骰子决定是否放星号(那样概率恒定),而是为每一行预先确定星号个数,再从中随机选取位置填充。原代码的问题在于:它在内层循环中反复调用 random_int() 并始终只修改同一列 j 的值(且未重置该行其他位置),导致逻辑混乱、结果不可控。
以下是优化后的专业实现:
import random
import sys
def print_array(size: int) -> None:
for row in range(size):
# 初始化一行:全部为紫色点
line = ["\x1b[35m." for _ in range(size)]
# 计算本行应放置的星号数量:从 size 递减至 1(第0行最多,第size-1行最少)
num_stars = size - row
# 随机选取 num_stars 个不重复的列索引(保证位置均匀随机)
star_positions = random.sample(range(size), num_stars)
# 在选定位置填入白色星号
for pos in star_positions:
line[pos] = "\x1b[37m*"
# 一次性打印整行(避免逐字符换行)
print("".join(line))
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python script.py <size>")
sys.exit(1)
try:
size = int(sys.argv[1])
if size <= 0:
raise ValueError("Size must be a positive integer")
print_array(size)
except ValueError as e:
print(f"Error: {e}")
sys.exit(1)✅ 核心改进点说明:
- ✅ 可控递减逻辑:
num_stars = size - row确保第 0 行有size个星号,第 1 行size−1个……最后一行仅 1 个; - ✅ 无偏随机分布:
random.sample(range(size), num_stars)高效生成无重复的随机列索引,杜绝重叠或遗漏; - ✅ 内存与性能友好:不依赖
numpy或全局矩阵,按行生成、即打即弃,适合任意大小(避免大数组初始化开销); - ✅ 终端兼容性:保留 ANSI 转义序列(
\x1b[35m紫色、\x1b[37m白色),确保颜色正常显示。
⚠️ 注意事项:
- 若需「严格按百分比递减」(如第0行100%、第1行90%、第2行80%…),可将
num_stars改为max(1, round((1.0 - row / size) * size)); -
random.sample()要求采样数 ≤ 总数,因此num_stars必须 ≥ 0 —— 上述size - row天然满足(当row ); - 输出使用
print("".join(line))替代嵌套print(..., end="")+print(),避免每字符后意外换行。
此方案简洁、健壮、易扩展,是控制离散分布模式的典型实践。

















