web-dev-qa-db-fra.com

Créer un Bool aléatoire dans Swift

J'ai besoin de créer une valeur booléenne aléatoire dans mon jeu, dans Swift.

Il s'agit essentiellement, si Oui (ou 1), de générer un objet, si Non (ou 0), de générer l'autre.

Jusqu'à présent, en regardant cette question et une question similaire ici, j'ai trouvé ceci:

let randomSequenceNumber = Int(arc4random_uniform(2))

Maintenant ça marche, mais ça me semble biaisé à 0 ... comme ridiculement biaisé ...

Voici comment j'utilise ensuite la valeur:

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

Existe-t-il un meilleur moyen de mettre en œuvre cela en utilisant une valeur booléenne aléatoire? Ce n'est pas un parti pris pour une certaine valeur?

Mise à jour

Un peu d'expérience pour voir combien 1's vs 0 ont été générés dans 10 000 appels:

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
29
Reanimation
import Foundation

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

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

pour un générateur plus avancé, la théorie est disponible ici

pour une compréhension de base de la distribution de Bernoulli (ou binomiale) ici

49
user3441734

Xcode 10 avec Swift 4.2

On dirait Apple  les ingénieurs écoutent

let randomBool = Bool.random()
25
extension Bool {
    static func random() -> Bool {
        return arc4random_uniform(2) == 0
    }
}

// usage:
Bool.random()
16
Adam Waite