LUA: è riducendo iteratori dall'interno del ciclo possibile?
Domanda
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
.
Il codice sopra era destinato a generare una serie di numeri casuali da 1 a "dimensione" evitando valori di ripetizione.Ho provato a realizzare quello ripetendo il livello superiore "per" il loop ancora una volta se il valore appena generato è stato presente prima di qualche parte nell'array - riducendo il suo iteratore.In qualche modo non funziona.Perché?
Sta modificando il valore Iteratore dall'interno del ciclo non è possibile?
Esempio di output con valori di ripetizione in array:
>lua5.1 "pairsss.lua"
2
1
10
6
5
2
5
7
7
4
>Exit code: 0
. Soluzione
La soluzione al tuo problema è quella di mescolare l'array, come Iterazione casuale per riempire un tavolo in Lua .
.Per rispondere alla tua domanda, da LUA 5.1 Manuale di riferimento :
.§2.4.5 - per dichiarazione
Tutte le tre espressioni di controllo vengono valutate solo una volta, prima che il loop inizi.Devono tutti provocare numeri.
Ciò significa, indipendentemente dal modo in cui si modifica il valore del i
all'interno del loop for
, non influisce su come viene eseguita l'iterazione.
Altri suggerimenti
È possibile utilizzare un set invece di un array, come fatto dall'autore della domanda Randomizza i numeri in Lua senza ripetizioni .Come sottolinea una delle risposte, poiché il set si avvicina alle dimensioni della tua gamma di numeri randome (diciamo, hai numeri casuali da 1 a 100 e il tuo set è di dimensioni 50) sarà sempre più difficile trovare un numeronon è già stato sceltoPuoi vederlo per un set di dimensioni 50 e selezionando un numero casuale da 1 a 100, quindi quando hai il set a metà pieno, hai una probabilità del 25-50% di trovare la scelta casuale è già in uso nel tuoimpostato.In tal caso, mescolare è la strada da percorrere, come spiegato in una delle risposte a quel post ( Randomizza i numeri in Lua senza ripetizioni ).