PDA

View Full Version : c# tobola senza ripetizione dei numeri


pdor90
08-12-2007, 22:51
:help: :help: vorrei fre un programma in visual c# tipo tombola ma ho un problema i numeri che si ripetono ho provato a utilizziare il .next(1,91) ma niente anche mettendolo in un vettore e facendo + controlli con dei cicli for ho sempre delle ripetizioni voi avete soluzioni per questo problemi? :help: :help:

marco.r
08-12-2007, 23:49
Ti serve in pratica una permutazione dei numeri da uno a 90

un metodo semplice e' quello di partire con un array con i valori da 1 a 90, cominciare dalla prima posizione e scambiarla con un'altra a caso (e ottieni il primo valore). Poi passi alla posizione successiva e fai uguale e cosi' via per tutte le posizioni.
Non so il C#, ti offro una versione python che dovrebbe darti cmq l'idea di come funzioni:

def tombola_casuale():
estrazioni = range(1,91)
for i in range(89):
j = random.randint(i,89)
estrazioni[i],estrazioni[j] = estrazioni[j],estrazioni[i]
yield estrazioni[i]
yield estrazioni[89]

Se non vuoi star li' a usare gli iteratori in C#, semplicemente invece di ritornare il valore man mano calcola tutto l'array e ritornalo alla fine, e userai l'array risultante per le estrazioni.

¬A or B
09-12-2007, 00:06
Un altro metodo potrebbe essere quello di inserire i numeri da 1 a 90 in una lista, quindi generi numeri a caso da 0 fino alla taglia della lista meno 1.
Questo numero random lo utilizzi come indice per accedere agli elementi della lista. In questo modo scegli un numero proveniente dalla lista e quindi lo rimuovi. Quando genererai un nuovo numero casuale accederai ad un nuovo elemento della lista che, per forza, non potrà essere un numero già estratto (quelli estratti vengono rimossi).

pdor90
09-12-2007, 17:05
grazie per ora mi avete fatto venire in mente un modo

pdor90
09-12-2007, 17:37
:D a or b ho capito quello che mi vuoi dire mi basta rendere invisibile la list box e non ho problemi ottimo metodo grazie vi faro' sapere se funziona
:D :)

wingman87
09-12-2007, 18:53
Probabilmente lui parlando di lista non intendeva una listbox ma un array.

¬A or B
10-12-2007, 08:09
In effetti con "lista" intendevo una struttura dati tipo "linked list". Tramite questa struttura simuli il sacchetto con i numeri. Ecco perché quando estrai un numero lo rimuovi dalla lista, operazione che è molto semplice fare su una lista. Questa operazione la puoi fare anche tramite un array, però ogni volta che estrai un numero devi stare attento a ricompattare l'array altrimenti rischi che ad una estrazione successiva tiri fuori un numero già estratto oppure estrai un "buco" nel senso che restituisci un numero non valido se i numeri estratti li sostituisci nell'array con qualcosa come -1 (un'alternativa sarebbe rigenerare il numero random se l'accesso all'array ti porta su un "buco" fino a quando non ottieni l'indice di un numero valido).

cionci
10-12-2007, 10:02
La soluzione di ¬A or B è ottima soprattutto in presenza di pochi elementi (90 sono molto pochi).