Reanimation
Reanimation

Reputation: 3336

Creating random Bool in Swift

I'm needing to create a random bool value in my game, in Swift.

It's basically, if Yes (or 1), spawn one object, if No (or 0), spawn the other.

So far, looking at this question and a similar one on here, I found this:

let randomSequenceNumber = Int(arc4random_uniform(2))

Now it works, but it seems bias to 0 to me... like ridiculously bias...

This is how I'm then using the value:

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

Is there a better way to implement this using a random bool value? That isn't bias to a certain value?

Update

Bit of an experiment to see how many 1's vs 0's were were generated in 10,000 calls:

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

Upvotes: 43

Views: 18838

Answers (3)

Warif Akhand Rishi
Warif Akhand Rishi

Reputation: 24248

Xcode 10 with Swift 4.2

Looks like Apple  engineers are listening

let randomBool = Bool.random()

Upvotes: 91

user3441734
user3441734

Reputation: 17544

import Foundation

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

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

for more advanced generator the theory is available here

for basic understanding of Bernoulli (or binomial) distribution check here

Upvotes: 57

Adam Waite
Adam Waite

Reputation: 18855

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

// usage:
Bool.random()

Upvotes: 17

Related Questions