Domanda

Ho alcune funzioni che generano doppia, galleggiante, breve, lungo valori casuali. Ho un'altra funzione per cui passo il tipo di dati e che restituisce un valore casuale. Ora ho bisogno di scegliere in quella funzione il valore di ritorno sulla base del tipo di dati passati. Ad esempio, se mi passate galleggiante, ho bisogno di:

la probabilità che il ritorno sia un galleggiante è 70%, la probabilità che il ritorno sia un doppio, a breve ea lungo è il 10% ciascuno. Posso effettuare chiamate verso l'altra funzione per generare i corrispondenti valori casuali, ma come faccio inserirsi nei pesi probabilistici per il ritorno finale? Il mio codice è in C ++.

Alcuni indicatori sono apprezzati.

Grazie.

È stato utile?

Soluzione

numeri casuali C ++ hanno distribuzione uniforme. Se avete bisogno di variabili aleatorie di un altro distribuzione è necessario basare la sua formula matematica sulla distribuzione uniforme.

Se non si dispone di una formula matematica per la variabile casuale che si può fare qualcosa di simile:

int x = rand() % 10;
if (x < 7)
{
 // return float
}
else (if x == 7)
{
 // return double
}
else (if x == 8)
{
 // return short
}
else (if x == 9)
{
 // return long
}

Altri suggerimenti

Questo può servire come alternativa per futuri riferimenti che possono ottenere la probabilità di valori precisi come il 99,999% e 0,0001% Per ottenere probabilità (percentuale reale) fare in quanto tali:

//70%
double probability = 0.7;
double result = rand() / RAND_MAX;
if(result < probability)
   //do something

Ho usato questo metodo per creare grandi reti di percolato e funziona come un fascino per i valori di precisione.

Non so se ho capito bene che cosa si vuole fare, ma se si desidera solo per assicurare che le probabilità sono 70-10-10-10, procedere come segue:

  • generare un numero casuale nella r (1,2,3,4,5,6,7,8,9,10)
  • se r <= 7: float
  • se r == 8: breve
  • se r == 9: doppia
  • se r == 10: lunga

Credo che si riconoscono e si può adattare il modello di valori di probabilità arbitrari.

mmonem ha una bella interruttore probabilistica, ma tornando tipi differenti non è banale neanche. Avete bisogno di un unico tipo che possa adeguatamente (per i vostri scopi) codificare qualsiasi dei valori - Vai boost :: qualsiasi, boost :: variante, l'unione, o convertire il tipo più in grado (probabilmente doppio), o una rappresentazione di stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top