
本文介绍一种简洁高效的方法,通过控制每行随机插入星号的数量(而非固定概率),实现星号数量从上到下严格递减的效果,并避免原代码中重复覆盖、逻辑错位等问题。
本文介绍一种简洁高效的方法,通过控制每行随机插入星号的数量(而非固定概率),实现星号数量从上到下严格递减的效果,并避免原代码中重复覆盖、逻辑错位等问题。
在原代码中,print_array() 函数对每个单元格都调用 random_int() 并无条件赋值星号,导致每行实际只在同一列位置反复写入星号(因内层循环中 j 在每次 x 迭代时都被重新生成,但仅用于 mat[y][j] 赋值,而 print(mat[y][x]) 却遍历全部列——造成大量未赋值位置仍打印默认的 \x1b[35m.,且星号分布无规律、数量不可控)。更严重的是,它并未实现“逐行减少星号数量”的核心需求。
正确思路是:按行处理,每行独立决定星号个数与位置。推荐使用 random.sample() ——它能从 [0, 1, ..., size-1] 中无放回地随机选取指定数量的列索引,确保星号位置不重复且分布均匀。
以下是优化后的完整实现:
import random
import sys
def print_array(size: int) -> None:
for row in range(size):
# 初始化一行:全为紫色点
line = ["\x1b[35m." for _ in range(size)]
# 计算本行星号数量:首行 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)
size = int(sys.argv[1])
print_array(size)✅ 关键改进说明:
-
逐行可控:
num_stars = size - row确保第 0 行有size个星号,第 1 行size-1个……第size-1行仅 1 个; -
位置去重:
random.sample(range(size), num_stars)保证每行星号列坐标互异,避免堆叠; -
性能与可读性:不再依赖全局
numpy数组和嵌套索引,改用列表推导 + 字符串拼接,轻量且符合 Python 惯例; -
输出整洁:
print("".join(line))替代内层循环中的多次print(..., end="")和空print(),彻底解决换行混乱问题。
⚠️ 注意事项:
- 若需“概率递减”(如第 0 行 100% 概率、第 1 行 90%、第 2 行 80%…),应改用
random.random() 判断每个位置是否置星,但此时星号数量为<strong>期望值</strong>,非严格确定;本文方案满足“严格逐行递减数量”的典型需求,更稳定可靠。 - ANSI 颜色码
\x1b[35m(品红)和\x1b[37m(白)在支持终端中生效;若需纯文本效果,可直接替换为.和*。
运行 python script.py 5 将输出类似:
***** **... *.... .....
清晰体现星号数量由 5→4→3→2→1 的递减规律。

















