Julia创建仅含1、2、3的长度500随机向量出现0残留问题
问题分析:生成仅含1、2、3的随机向量时出现0元素的原因
问题描述
我希望创建一个长度为Dl=500的随机向量,向量元素仅包含1、2、3。我编写了如下代码:
v = fill(0, Dl) # 创建一个长度为500的全零向量 v[rand(1:length(v), Dl)] .= rand(1:3, Dl)
但运行后发现向量中仍存在0元素,即向量包含0、1、2、3而非仅1、2、3,请问问题出在哪里?
问题根源
rand(1:length(v), Dl)生成的是长度为500的随机索引数组,但这个数组里会有重复的索引值。这就导致:一部分位置被多次赋值,而另一部分位置可能一次都没被选中,这些未被选中的位置就保留了初始的0值。
举个简单例子,假设Dl=3,rand(1:3,3)可能输出[2,2,3],此时索引1从未被选中,对应位置的0就不会被替换。
解决方案
最直接高效的写法是直接生成目标向量,无需先创建全零数组:
Dl = 500 v = rand(1:3, Dl)
如果一定要保留“先初始化再赋值”的逻辑,需要确保每个索引都被覆盖到,比如用shuffle生成无重复的索引序列:
Dl = 500 v = fill(0, Dl) v[shuffle(1:Dl)] .= rand(1:3, Dl)
但这种写法完全没必要,直接用第一种方式更简洁。
内容的提问来源于stack exchange,提问作者Rainbow
相关产品推荐
相关产品推荐

