2012-10-03 13 views
6

Qualcuno potrebbe darmi un suggerimento su come generare numeri casuali "lisci"? Ecco cosa intendo per liscio:Algoritmo per numeri casuali "lisci"

I numeri casuali devono essere utilizzati in una partita, ad es. per la direzione del vento e la forza (qualcuno ricorda i vecchi "vermi" vecchi?). Naturalmente l'impostazione di numeri casuali per quei valori ogni due secondi apparirebbe terribilmente discontinua. Preferirei avere una sorta di oscillazione uniforme in un determinato intervallo di valori. Un po 'come un'onda sinusoidale ma molto più casuale.

Qualcuno ottiene quello che sto cercando? ;-) Qualche idea su come ottenere questo tipo di comportamento sarebbe apprezzata.

+1

probabilmente stai dopo un numero casuale per dirti quando cambiare la direzione del vento se vuoi simulare il vento. quando si verifica questo evento temporale casuale cambia direzione del vento, ma limita la direzione a un certo angolo e velocità (di nuovo casuale), quindi scegli semplicemente numeri casuali all'interno di un certo intervallo e costruisci gradualmente sul cambiamento + = 1 (0.0 - 5.0 a caso) ogni secondo (0-3 secondi casuali di nuovo lol) ecc. fino a quando non raggiungono un cambiamento casuale di 0-180 gradi in un dato momento, che di nuovo è casuale. abbastanza semplice, ma totalmente a voi come implementate questi tempi e gradi di variazione, ecc. – pengibot

+1

@Jodrell La legge di Benford è totalmente inapplicabile qui. La domanda dopo la distribuzione potrebbe essere una domanda interessante, ma la legge di Benford descrive semplicemente un fenomeno numerico, non descrive una distribuzione casuale a numeri casuali (descrive una distribuzione discreta che potrebbe essere campionata da - ma perché individuare questa particolare distribuzione?). –

+0

Puoi rappresentare il vento come un vettore e fare una media mobile con valori casuali. Questo attenuerà le fluttuazioni in proporzione con la dimensione del campione media. –

risposta

4

Se si desidera che il delta (modifica) sia piccolo, generare un piccolo numero casuale per il delta.

Per esempio, invece di:

windspeed = random (100)    # 0 thru 99 inclusive 

uso qualcosa di simile:

windspeed = windspeed - 4 + random (9) # -4 + 0..8 gives -4..4 
if windspeed > 99: 
    windspeed = 99 
if windspeed < 0: 
    windspeed = 0 

In questo modo, la velocità del vento è ancora mantenuto entro i limiti richiesti ed è sempre e solo a poco a poco cambia.

Questo funzionerà per valori assoluti come la velocità, e anche per la direzione se la cosa che stai cambiando gradualmente è l'angolo da una direzione fissa.

Può essere utilizzato per qualsiasi misurazione.


In alternativa, se si vuole garantire che i cambiamenti windspeed con possibilmente grande delta, ma lentamente, è in grado di generare la vostra velocità del vento di destinazione come attualmente si fa, ma muoversi gradualmente verso di essa:

windspeed = 50 
target = windspeed 
while true: 
    # Only set new target if previous target reached. 

    if target == windspeed: 
     target = random (100) 

    # Move gradually toward target. 

    if target > windspeed: 
     windspeed = windspeed + max (random (4) + 1, target - windspeed) 
    else: 
     windspeed = windspeed - max (random (4) + 1, target - windspeed) 

    sleep (1) 
+2

Ma non sarebbe possibile che la velocità del vento possa rimanere bloccata al limite superiore o inferiore? – Boris

+2

@ Boris, si, qual è il tuo punto? Ecco cosa può fare anche il tempo casuale :-) Se vuoi assicurarti che graviti attorno a un valore specifico (come 50), appesantisci i numeri casuali per ottenere quello. – paxdiablo

+0

Oppure vedere il mio aggiornamento che disconnette il valore desiderato dagli incrementi. – paxdiablo

0

Il rumore Perlin (o meglio il simplex) sarebbe il primo metodo che viene in mente quando si genera un rumore levigato. Restituisce un numero compreso tra 1 e -1, che aggiungerà o sottrae dal valore corrente. Puoi moltiplicarlo per renderlo meno sottile o meglio ancora ... rendere il valore del vento più basso -1 e il valore del vento più alto 1.

Quindi avere semplicemente una seminatrice come contatore (1,2,3 ... ecc.) dato che l'input perlin/simplex mantiene i valori "uniformi".