Lua:ループの内側からイテレータが減少していますか?
質問
array={}
size=10
math.randomseed(os.time())
for i=1,size do
array[i]=math.random(size)
if(i>1) then
for j=1,i do
if array[j]==array[i] then
i=i-1
break
end
end
end
end
for i=1,size do
print(array[i])
end
.
上記のコードは、1から 'サイズ "の繰り返し値を回避するための乱数の配列を生成することを意味していました。イテレータを減らすことで、新しく生成された値が配列のどこかに存在していた場合、一度上位レベルのループを繰り返すことで、1回のループを繰り返すことを試みました。どういうわけかそれはうまくいきません。なぜ?
ループの内側からイテレータ値を変更していませんか?
配列の繰り返し値を持つ出力例:
>lua5.1 "pairsss.lua"
2
1
10
6
5
2
5
7
7
4
>Exit code: 0
. 解決
あなたの問題に対する解決策は、 Lua のテーブルを埋めるためのランダムな反復のように、アレイをシャッフルすることです。
あなたの質問に答えるために、 LUA 5.1リファレンスマニュアル:
√2.4.5 - 文の場合
ループが起動する前に、3つの制御式全てが一度だけ評価されます。それらはすべて数字になる必要があります。
それは、i
ループ内のfor
の値を変更していようと関係なく、反復の行われた方法には影響しません。
他のヒント
質問の作者によって行われるように、配列の代わりにセットを使用することができます。繰り返しのないLUAの数をランダム化する。回答の1つが指摘しているように、あなたのセットはあなたのRandome数の範囲にサイズが近づくにつれて(言い、あなたは乱数1から100がサイズ50を持っています)それは数字を見つけるのはますます難しくなるでしょう。まだ選んでいません。一連のサイズ50のセットでは、1から100までのランダムなものを選ぶことができます。それからあなたがセットを半分いっぱいにしている時までに、あなたはランダムピックがすでにあなたの内ですでに使用されていることを見つける可能性が25-50%のチャンスを持っていますセットする。その場合、その投稿に対する答えの1つ( repeats のないLUAの数をランダム化する。