Skip to content

Instantly share code, notes, and snippets.

@mattt mattt/random.swift
Last active Aug 26, 2019

Embed
What would you like to do?
import Darwin
extension Int {
static func random() -> Int {
return Int(arc4random())
}
static func random(range: Range<Int>) -> Int {
return Int(arc4random_uniform(UInt32(range.endIndex - range.startIndex))) + range.startIndex
}
}
extension Double {
static func random() -> Double {
return drand48()
}
}
@gampleman

This comment has been minimized.

Copy link

commented Jan 1, 2015

A RandomInstance (or Arbitrary) protocol would be nice, which would mean any type could implement a random method to get a random instance of the type (useful for things like quick check).

@rparada

This comment has been minimized.

Copy link

commented Jan 3, 2015

Here are some you can add to shuffle array elements using your extension for random number generation.

extension Array {
    /**
     * Shuffles the array elements.
     */
    mutating func shuffle() {
        if count > 1 {
            let iLast = count - 1
            for i in 0..<iLast {
                let iRandom = Int.random(i...iLast)
                let temp = self[i]
                self[i] = self[iRandom]
                self[iRandom] = temp
            }
        }
    }

    /**
     * Returns a copy of the array with the elements shuffled.
     */
    func shuffled() -> [T] {
        var newArray = [T](self)
        newArray.shuffle()
        return newArray
    }
}
@lchenay

This comment has been minimized.

Copy link

commented Jul 8, 2015

If someone use this code, replace return Int(arc4random()) by `return Int(arc4random_uniform(UInt32(Int.max)))``
arc4random() return UInt32 from 0 to UInt32.max. Not all the range are compatible with Int and will result in a EXC_BAD_INSTRUCTION

@callmewhy

This comment has been minimized.

Copy link

commented Aug 12, 2015

@lchenay is right

@MatrixSenpai

This comment has been minimized.

Copy link

commented May 25, 2016

Note iLast can be left out in favor of ..<count.
Same in Int.random(i..<count).
Also note [T] is deprecated in favor of [Element]
For sets

extension Set {
    mutating func shuffle() {
        if count > 1 {
            for i in 0..<count {
                let r = Int.random(i..<count)
                let temp = self[self.startIndex.advancedBy(r)]
                self.removeAtIndex(self.startIndex.advancedBy(r))
                self.insert(temp)
            }
        }
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.