Newsgroup: it.comp.lang.visual-basic
Titolo: numeri a caso

Devo fare in modo che a ogni click esca un numero da uno a dieci e  che
i numeri già usciti non si ripetano, ma che escano
comunque tutti i dieci numeri nel giro di dieci click.
Mi spiego meglio:
dovrebbero uscire serie casuali complete come:
5-7-9-8-10-2-3-4-1-6
10-3-4-1-2-7-5-6-9-8
2-3-1-6-5-4-9-7-8-10
eccetera
Come devo fare?
Mandatemi due righe di codice, vi prego....

 2-3-1-6-5-4-9-7-8-10
soluzione 1) (molto elegante ma laboriooooosa!):
Fatti un filino (! :-) ) di risorse (10 ! per la precisione, quante sono le
permutazioni di 10 oggetti), identifica le risorse con un intero da 0 a 10!
- 1 (= 3.628.799) 
Questo passo non è necessario, ma ti evita di scrivere un Select Case
interminabile
(3.628.800 di possibili casi!) nella Sub che ti ho scritto sotto.
Se proprio non vuoi scriverlo "a mano", puoi farti un programmino che lo
prepara,
scrivendo 10! righe diverse corrispondenti alle possibili 10! permutazioni
Scrivi quindi le tue stringhe in questo modo:
2-3-4-5-6-7-8-9-0-1
ecc. ecc. (10! volte diverse con tutte le 10! permutazioni)
Poi dichiara un array:
Dim Matrice(0 To 9) As Integer
...e scrivi queste routines:
Sub InitArray ()
Const DieciFattoriale = 3628800
Dim RandomSeq as long
'RandomSeq è un numero che va da 0
'a 10! e identifica la particolare 
'permutazione uscita dal "cilindro" :-)
Dim i as integer
Dim stringa as string
Dim sep as long
   RandomSeq = Int(DieciFattoriale * Rnd)
   Stringa=LoadResString(RandomSeq)
   For i=0 to 9
      if i < 9 then
         sep = Instr(stringa, "-")
         Matrice(i) = Val(left(stringa, sep-1))
         stringa=mid(stringa, sep+1)
      else
         Matrice(i)=Val(stringa)
      end if
   next i
end sub
Function Generandom() as integer
Static contatore as integer
   if contatore = 0 then InitArray
   Generandom = Matrice(contatore)
   contatore = (contatore + 1) Mod 10
end function
_____________________________________
soluzione 2) (mooooolto più semplice):
Dim GiaUsciti(1 to 10) as Boolean
Sub InitArray
 Dim i as integer
 For i = 1 to 10
   GiaUsciti(i)=False
 Next i
End Sub
Function Generandom() as integer
 Static contatore as integer
 Dim Cilindro as integer
  if contatore = 0 then InitArray
  cilindro = Int(10 * Rnd + 1)
  'controlla che non sia già uscito
  Do Until not GiaUsciti(cilindro)
     'se è già uscito, pesco il successivo
     cilindro = cilindro Mod 10 + 1
  Loop
  Generandom = cilindro
  contatore = (contatore + 1) Mod 10
End Function
________________________________________
!!!!!!!!!!!  ATTENZIONE:  !!!!!!!!!!!!!
Qualunque soluzione tu scelga, RICORDATI di chiamare Randomize all'inizio
del programma, altrimenti la funzione Rnd ti restituirà sempre la stessa
sequenza ad ogni lancio del prg.  ;-)
<-: ...a te la scelta!  
Bye :->
-- 
Ale...@tiscalinet.it

 End Function
AriBye :->
-- 
Ale...@tiscalinet.it


        Dim Numeri(1 To 10) As Integer
        Dim Estratti As Integer
        Dim Acaso As Integer
        Dim i As Integer
        While Estratti <> 10
              Randomize Timer
              Acaso = Int(Rnd * 10) + 1
              If Numeri(Acaso) = 0 Then
                 Debug.Print Acaso;
                 Numeri(Acaso) = -1
                 Estratti = Estratti + 1
              End If
        Wend
        Debug.Print
Ciao........
Ven.