Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift random float between 0 and 1

In Swift, I'm trying to get a random float between 0 and 1 but I can't seem to get the type conversions to work.

func randomCGFloat() -> CGFloat {     return CGFloat(arc4random()) / UINT32_MAX } 

I'm getting a 'CGFloat' is not convertible to 'UInt8' error

Running Xcode 6.

like image 961
Joe_Schmoe Avatar asked Jul 31 '14 03:07

Joe_Schmoe


People also ask

What is arc4random Swift?

The arc4random() function generates numbers between 0 and 4,294,967,295, giving a range of 2 to the power of 32 - 1, i.e., a lot. But if you wanted to generate a random number within a specific range there's a better alternative.

How do I randomly select a number in Swift?

To generate a random number in Swift, use Int. random() function. Int. random() returns a number, that is randomly selected, in the given range.

How do I generate a random string in Swift?

In Swift, the randomElement() method is used to get a random character from a string.


2 Answers

This is extension for random numbers of Int, Double, Float, CGFloat

Swift 3 & 4 & 5 syntax

import Foundation import CoreGraphics  // MARK: Int Extension  public extension Int {      /// Returns a random Int point number between 0 and Int.max.     static var random: Int {         return Int.random(n: Int.max)     }      /// Random integer between 0 and n-1.     ///     /// - Parameter n:  Interval max     /// - Returns:      Returns a random Int point number between 0 and n max     static func random(n: Int) -> Int {         return Int(arc4random_uniform(UInt32(n)))     }      ///  Random integer between min and max     ///     /// - Parameters:     ///   - min:    Interval minimun     ///   - max:    Interval max     /// - Returns:  Returns a random Int point number between 0 and n max     static func random(min: Int, max: Int) -> Int {         return Int.random(n: max - min + 1) + min      } }  // MARK: Double Extension  public extension Double {      /// Returns a random floating point number between 0.0 and 1.0, inclusive.     static var random: Double {         return Double(arc4random()) / 0xFFFFFFFF     }      /// Random double between 0 and n-1.     ///     /// - Parameter n:  Interval max     /// - Returns:      Returns a random double point number between 0 and n max     static func random(min: Double, max: Double) -> Double {         return Double.random * (max - min) + min     } }  // MARK: Float Extension  public extension Float {      /// Returns a random floating point number between 0.0 and 1.0, inclusive.     static var random: Float {         return Float(arc4random()) / 0xFFFFFFFF     }      /// Random float between 0 and n-1.     ///     /// - Parameter n:  Interval max     /// - Returns:      Returns a random float point number between 0 and n max     static func random(min: Float, max: Float) -> Float {         return Float.random * (max - min) + min     } }  // MARK: CGFloat Extension  public extension CGFloat {      /// Randomly returns either 1.0 or -1.0.     static var randomSign: CGFloat {         return (arc4random_uniform(2) == 0) ? 1.0 : -1.0     }      /// Returns a random floating point number between 0.0 and 1.0, inclusive.     static var random: CGFloat {         return CGFloat(Float.random)     }      /// Random CGFloat between 0 and n-1.     ///     /// - Parameter n:  Interval max     /// - Returns:      Returns a random CGFloat point number between 0 and n max     static func random(min: CGFloat, max: CGFloat) -> CGFloat {         return CGFloat.random * (max - min) + min     } } 

Use :

let randomNumDouble  = Double.random(min: 0.00, max: 23.50) let randomNumInt     = Int.random(min: 56, max: 992) let randomNumFloat   = Float.random(min: 6.98, max: 923.09) let randomNumCGFloat = CGFloat.random(min: 6.98, max: 923.09) 
like image 121
YannSteph Avatar answered Sep 22 '22 05:09

YannSteph


Try initializing the divisor as a float as well, a la:

CGFloat(Float(arc4random()) / Float(UINT32_MAX)) 
like image 34
jmduke Avatar answered Sep 25 '22 05:09

jmduke