
本文介绍如何在打印二维字符阵列时,让每行中星号“”的数量随行号增加而线性减少,并确保每行的星号位置随机分布。
本文介绍如何在打印二维字符阵列时,让每行中星号“*”的数量随行号增加而线性减少,并确保每行的星号位置随机分布。
要实现“每行星号数量逐行递减”的效果,关键在于:不再对每个单元格独立掷骰子决定是否放星号(那样概率恒定),而是为每一行预先确定星号个数,再从中随机选取位置填充。原代码的问题在于:它在内层循环中反复调用 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 <p>✅ <strong>核心改进点说明:</strong> </p>
<ul>
<li>✅ <strong>可控递减逻辑</strong>:<code>num_stars = size - row</code> 确保第 0 行有 <code>size</code> 个星号,第 1 行 <code>size−1</code> 个……最后一行仅 1 个; </li>
<li>✅ <strong>无偏随机分布</strong>:<code>random.sample(range(size), num_stars)</code> 高效生成无重复的随机列索引,杜绝重叠或遗漏; </li>
<li>✅ <strong>内存与性能友好</strong>:不依赖 <code>numpy</code> 或全局矩阵,按行生成、即打即弃,适合任意大小(避免大数组初始化开销); </li>
<li>✅ <strong>终端兼容性</strong>:保留 ANSI 转义序列(<code>\x1b[35m</code> 紫色、<code>\x1b[37m</code> 白色),确保颜色正常显示。</li>
</ul>
<p>⚠️ <strong>注意事项:</strong> </p>
<ul>
<li>若需「严格按百分比递减」(如第0行100%、第1行90%、第2行80%…),可将 <code>num_stars</code> 改为 <code>max(1, round((1.0 - row / size) * size))</code>; </li>
<li>
<code>random.sample()</code> 要求采样数 ≤ 总数,因此 <code>num_stars</code> 必须 ≥ 0 —— 上述 <code>size - row</code> 天然满足(当 <code>row ); </code>
</li>
<li>输出使用 <code>print("".join(line))</code> 替代嵌套 <code>print(..., end="")</code> + <code>print()</code>,避免每字符后意外换行。</li>
</ul>
<p>此方案简洁、健壮、易扩展,是控制离散分布模式的典型实践。</p></size>










