Condividi:        

Ottenere numero casuale con pesi diversi

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Ottenere numero casuale con pesi diversi

Postdi wallace&gromit » 11/01/23 15:12

Ciao a tutti,
vorrei ottenere con una macro un numero tra 1 e 3.
Codice: Seleziona tutto
Sub casual()
pos = Int(3 * Rnd + 1)
End Sub

Vorrei però avere in ordine di frequenza tanti 2, qualche 1 e pochi 3.
Ho pensato di scrivere una sequenza delle mie preferenze, tipo:
1,1,1,2,2,2,2,2,2,2,3 (magari col tempo vorrei cambiare il numero di possibilità e la loro proporzione)
e scegliere random tra questi, è una buona idea?
Come lo inserisco nella macro?
Lo so, queste benedette matrici non le so ancora usare! :oops:
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2180
Iscritto il: 16/01/12 14:21

Sponsor
 


Re: Ottenere numero casuale con pesi diversi

Postdi wallace&gromit » 11/01/23 15:35

Grazie, ma queste soluzioni comportano l'uso di celle, io vorrei risolvere tutto all'interno della macro, se possibile.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2180
Iscritto il: 16/01/12 14:21

Re: Ottenere numero casuale con pesi diversi

Postdi Dylan666 » 11/01/23 15:53

Allora basta fare dei SELECT CASE divisi per le percentuali di probabilità di estrazione come dice CajunCenturion qui:
https://www.tek-tips.com/viewthread.cfm?qid=285455
Avatar utente
Dylan666
Moderatore
 
Post: 40099
Iscritto il: 18/11/03 16:46

Re: Ottenere numero casuale con pesi diversi

Postdi wallace&gromit » 11/01/23 16:01

Buona idea, sì:
Codice: Seleziona tutto
Sub casual()
pos2 = Int(10 * Rnd + 1)

Select Case pos2
   Case 1 To 3
      pos = 1
   Case 4 To 9
      pos = 2
   Case 10
      pos = 3
End Select

End Sub

In attesa di imparare a gestire le matrici direi che va bene.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2180
Iscritto il: 16/01/12 14:21

Re: Ottenere numero casuale con pesi diversi

Postdi Anthony47 » 11/01/23 16:29

Un'altra possibilita' piu' complicata:
Codice: Seleziona tutto
Sub RandSpec()
Dim wArr(1 To 100), I As Long, oArr()
Dim ProbArr, hMany As Long, cRnd As Long
'
hMany = 100                     '<<< Quanti numeri?
ProbArr = Array(0, 50, 90)      '<<< Matrice fasce di probabilita'
'
ReDim oArr(1 To hMany, 1 To 1)
For I = 1 To 100
    wArr(I) = I
Next I
'Crea i numeri:
For I = 1 To hMany
    cRnd = Int(100 * Rnd()) + 1                     'Tra 1 e 100
    oArr(I, 1) = Application.Match(cRnd, ProbArr)
Next I
'Li scrive nel range indicato:
Range("N1").Resize(hMany, 1).Value = oArr           '<<< Ho usato N1 del foglio corrente
End Sub

Le righe marcate <<< vanno compilate come da preferenze; in particolare ProbArr definisce quanti numeri vuoi avere e la loro numerosita'. Con i valori impostati (0, 50, 90) :
-1 sara' assegnato nel 50% dei casi
-2 nel 40%
-3 nel 10%
Il primo valore dell'array va impostato sempre a 0

Ciao a tutti

Edit:
Per la precisione: 1=49% (da 1 a 49); 2=40% (da 50 a 89); 3=11% (da 90 a 100)
Avatar utente
Anthony47
Moderatore
 
Post: 19435
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Ottenere numero casuale con pesi diversi

Postdi wallace&gromit » 11/01/23 16:37

Ah beh, se questo doveva insegnarmi gli array sono perso subito.
Penso che mantengo la soluzione precedente, che posso gestire facilmente.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2180
Iscritto il: 16/01/12 14:21

Re: Ottenere numero casuale con pesi diversi

Postdi Anthony47 » 11/01/23 16:46

Te l'ho detto che era piu' complicata; ma forse piu' flessibile da variare, con granularita' che arriva all'1% (wow :D ); lasciamo a Cajun-come-si-chiama le cose semplici...

Ri-Edit
Azzarola, ho pure sbagliato a pubblicare il codice:
Codice: Seleziona tutto
Sub RandSpec()
Dim I As Long, oArr()
Dim ProbArr, hMany As Long, cRnd As Long
'
hMany = 1000                     '<<< Quanti numeri?
ProbArr = Array(0, 60, 90)      '<<< Matrice fasce di probabilita'
'
ReDim oArr(1 To hMany, 1 To 1)
'Crea i numeri:
For I = 1 To hMany
    cRnd = Int(100 * Rnd()) + 1                     'Tra 1 e 100
    oArr(I, 1) = Application.Match(cRnd, ProbArr)
Next I
'Li scrive nel range indicato:
Range("N:N").Clear
Range("N1").Resize(hMany, 1).Value = oArr           '<<< Ho usato N1 del foglio corrente
End Sub

La wArr serviva in una prima ipotesi poi abortita vista la semplicità di lavorare con la ProbArr
Avatar utente
Anthony47
Moderatore
 
Post: 19435
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Ottenere numero casuale con pesi diversi":


Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti