2015-12-12 11 views
12

Quindi ho bisogno di creare un valore booleano a caso nel mio gioco, in Swift 2Creazione di Bool casuale a Swift 2

E 'in sostanza, se Yes (o 1), generare un oggetto, se No (o 0) , genera l'altro.

Finora, guardando this question e uno simile qui, ho trovato questo:

let randomSequenceNumber = Int(arc4random_uniform(2)) 

Ora funziona, ma sembra pregiudizi a 0 per me ... come ridicolmente bias ...

questo è come mi sto quindi utilizzando il valore:

if(randomSequenceNumber == 0) 
    //spawn object A 
else 
    //spawn object B 

c'è un modo migliore per implementare questo utilizzando un valore bool casuale? Non è un pregiudizio per un certo valore?

Aggiornamento

un po 'di un esperimento per vedere erano state generate quanti 1 's vs 0' s in 10.000 chiamate:

func experiment() { 
    var numbers: [Int] = [] 
    var tester: Int = 0 
    var sum = 0 

    for i in 0...10000 { 
     tester = Int(arc4random_uniform(2)) 
     numbers.append(tester) 
     print(i) 
    } 

    for number in numbers { 
     sum += number 
    } 

    print("Total 1's: ", sum) 
} 

Test 1: Console Output: Total 1's: 4936 
Test 2: Console Output: Total 1's: 4994 
Test 3: Console Output: Total 1's: 4995 
+0

Ho provato ad utilizzare tale funzione in un parco giochi contando il numero di zero e uno risultati per 10.000 chiamate. Sicuramente non vedo il pregiudizio che stai vivendo. (Più come +/- 1,2% in entrambe le direzioni) Ci sono altre condizioni nella tua app che potrebbero influenzare il risultato? –

+0

Davvero? Forse sembra solo un pregiudizio ... forse, non è abbastanza casuale (o abbastanza distribuito abbastanza) se sai cosa intendo :( – Reanimation

+0

Provalo! Vedi se ottieni lo stesso risultato nel tuo ambiente. –

risposta

28
import Foundation 

func randomBool() -> Bool { 
    return arc4random_uniform(2) == 0 
} 

for i in 0...10 { 
    print(randomBool()) 
} 

per il generatore più avanzato la teoria è disponibile here

per conoscenza di base di Ber noulli (o binomiale) controllo distribuzione here

+1

Questo è sicuramente un codice migliore, quindi ho modificato il mio in 'let randomSequenceNumber = Int (arc4random_uniform (2)) == 0? true: false' – Reanimation

+1

fino a te, la creazione di un Int non è affatto necessaria ... la distribuzione è sufficiente per quasi tutte le applicazioni. se non sei ancora soddisfatto, controlla la teoria dal link che ti fornisco – user3441734

+0

Oh, ho letto da qualche parte è buona norma eseguire il cast a int per rimuovere l'assoluta polarizzazione. In ogni caso, modo decisamente migliore. In effetti controllerò quel documento. Grazie per la pubblicazione. – Reanimation

11
extension Bool { 
    static func random() -> Bool { 
     return arc4random_uniform(2) == 0 
    } 
} 

// usage: 
Bool.random()