venerdì 26 settembre 2014

Numeri casuali e algoritmo per alternare i due membri di un array con inizio casuale.

Devo attribuire i turni non festivi con un meccanismo casuale, alla medicina o alla cardiologia.
Inizio con uno, quindi alterno i due reparti.

Quindi prima formatto il foglio, quindi sul range Reparto metto il nome del reparto con questo meccanismo casuale.
Ma vediamo come fare una sequenza casuale...

Forse mi conviene fare un array con i nomi dei due reparti.
 Sub main()
    Dim reparti(1) As String
    reparti(0) = "MED"
    reparti(1) = "CAR"
 End Sub
...semplicissimamente elementare e immediato...

Adesso rivediamo un po' come si fanno i numeri casuali...

Sì: ecco un codice che mi permette di vedere la quantità di 1 e di 0 che sono stati estratti a sorte con 50 estrazioni:
 Sub main()
 Dim n As Integer
 Dim nzero As Integer, nuno As Integer
 
 For k = 1 To 50
    n = Int(Rnd() * 2)
    If n = 0 Then nzero = nzero + 1
    If n = 1 Then nuno = nuno + 1
 Next k
 
 Debug.Print nzero
 Debug.Print nuno
 Debug.Print "-----"
 End Sub
Ed ecco i risultati, che mi pare ci stiano piuttosto bene con la "casualità" della cosa:
 26 
 24 
-----
 24 
 26 
-----
 29 
 21 
-----
 24 
 26 
-----
 25 
 25 
-----
 22 
 28 
-----
 27 
 23 
-----
 25 
 25 
-----
 30 
 20 
-----



Fatto questo, estraiamo a sorte dagli elementi del piccolo array:
 Sub main()
 Dim reparti(1) As String
 Dim n As Integer

 
 reparti(0) = "CAR"
 reparti(1) = "MED"
 
 
 For k = 1 To 50
    n = Int(Rnd() * 2)
    Debug.Print reparti(n)
 Next k

 End Sub
...che però mi dà lunghe sequenze sia dell'uno che dell'altro...
CAR
CAR
CAR
MED
MED
CAR
CAR
CAR
CAR
MED
CAR
CAR
MED
CAR
MED
CAR
CAR
MED
CAR
CAR
MED
CAR
MED
CAR
CAR
MED
MED
MED
CAR
CAR
MED
MED
MED
MED
CAR
MED
MED
CAR
MED
MED
MED
CAR
CAR
CAR
CAR
CAR
CAR
MED
CAR
CAR



Meglio ancora, invece, è rendere casuale solo la prima estrazione e successivamente andare per alternanza:
Sub main()
Dim reparti(1) As String
Dim n As Integer

 
reparti(0) = "CAR"
reparti(1) = "MED"
 
n = Int(Rnd() * 2)
Debug.Print reparti(n)

For k = 1 To 50
    If n = 0 Then
        n = 1
    Else
        n = 0
    End If
    Debug.Print reparti(n)
Next k
debug.print "-----"
End Sub
Ed ecco alcune estrazioni ripetute:
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
-----
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
-----
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
-----
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
MED
CAR
-----
Sì: inizia casualmente, quindi si alternano regolarmente.

Nessun commento:

Posta un commento