乱数を生成する必要があります。
arc4random
関数だけでなく、arc4random_uniform
関数ももう存在しないようです。
私が持っているオプションはarc4random_stir()
、arc4random_buf(UnsafeMutablePointer<Void>, Int)
、そしてarc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32)
です。
関数に関するドキュメントが見つからないため、ヘッダーファイルのコメントにヒントがありません。
===== Swift 4.2/Xcode 10 =====
let randomIntFrom0To10 = Int.random(in: 1..<10)
let randomFloat = Float.random(in: 0..<1)
// if you want to get a random element in an array
let greetings = ["hey", "hi", "hello", "hola"]
greetings.randomElement()
内部でSwiftは仕事をやり遂げるためにarc4random_buf
を使います。
===== Swift 4.1/Xcode 9 =====
arc4random()
は、から4 294 967 295の範囲の乱数を返します。
drand48()
は、.から1.の範囲の乱数を返します。
arc4random_uniform(N)
は、からN - 1の範囲の乱数を返します。
例:
arc4random() // => UInt32 = 2739058784
arc4random() // => UInt32 = 2672503239
arc4random() // => UInt32 = 3990537167
arc4random() // => UInt32 = 2516511476
arc4random() // => UInt32 = 3959558840
drand48() // => Double = 0.88642843322303122
drand48() // => Double = 0.015582849408328769
drand48() // => Double = 0.58409022031727176
drand48() // => Double = 0.15936862653180484
drand48() // => Double = 0.38371587480719427
arc4random_uniform(3) // => UInt32 = 0
arc4random_uniform(3) // => UInt32 = 1
arc4random_uniform(3) // => UInt32 = 0
arc4random_uniform(3) // => UInt32 = 1
arc4random_uniform(3) // => UInt32 = 2
arc4random_uniform()上限が2のべき乗でない場合、 "モジュロバイアス"を回避するので、arc4random() % upper_bound
のような構成よりも推奨されます。
あなたも試すことができます:
let diceRoll = Int(arc4random_uniform(UInt32(6)))
私はそれを機能させるために "UInt32"を追加しなければなりませんでした。
この関数を呼び出して、最小値と最大値の範囲を指定するだけで、乱数を取得できます。
eg.like randomNumber(MIN:0、MAX:10)そしてあなたはから9の間の数を得るでしょう。
func randomNumber(MIN: Int, MAX: Int)-> Int{
return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN));
}
注: - あなたは常に整数値を出力します。
いくつかの調査の後、私はこれを書きました:
import Foundation
struct Math {
private static var seeded = false
static func randomFractional() -> CGFloat {
if !Math.seeded {
let time = Int(NSDate().timeIntervalSinceReferenceDate)
srand48(time)
Math.seeded = true
}
return CGFloat(drand48())
}
}
これでMath.randomFraction()
を実行して乱数を得ることができます[0..1 [最初にシードを覚えておく必要はありません。これが誰かに役立つことを願っています:o)
Swift 4.2で更新:
let randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomDouble = Double.random(in: 1...100)
let randomCGFloat = CGFloat.random(in: 1...1000)
もう1つの選択肢は、 xorshift128plus アルゴリズムを使用することです。
func xorshift128plus(seed0 : UInt64, _ seed1 : UInt64) -> () -> UInt64 {
var state0 : UInt64 = seed0
var state1 : UInt64 = seed1
if state0 == 0 && state1 == 0 {
state0 = 1 // both state variables cannot be 0
}
func Rand() -> UInt64 {
var s1 : UInt64 = state0
let s0 : UInt64 = state1
state0 = s0
s1 ^= s1 << 23
s1 ^= s1 >> 17
s1 ^= s0
s1 ^= s0 >> 26
state1 = s1
return UInt64.addWithOverflow(state0, state1).0
}
return Rand
}
このアルゴリズムは2 ^ 128 - 1の周期を持ち、 BigCrush テストスイートのすべてのテストに合格します。これは長い期間を持つ高品質の擬似乱数ジェネレータですが、は暗号的に安全な乱数ジェネレータではありません.
あなたはそれを現在の時間またはエントロピーの他のランダムな源からシードすることができます。例えば、UInt64
から/dev/urandom
を読み取るurand64()
という関数がある場合は、このように使用できます。
let Rand = xorshift128plus(urand64(), urand64())
for _ in 1...10 {
print(Rand())
}
Swift 3では:
0からlimitまでの乱数を生成します
let limit : UInt32 = 6
print("Random Number : \(arc4random_uniform(limit))")
let MAX : UInt32 = 9
let MIN : UInt32 = 1
func randomNumber()
{
var random_number = Int(arc4random_uniform(MAX) + MIN)
print ("random = ", random_number);
}
Int拡張としての私の実装from..<to
の範囲の乱数を生成します
public extension Int {
static func random(from: Int, to: Int) -> Int {
guard to > from else {
assertionFailure("Can not generate negative random numbers")
return 0
}
return Int(arc4random_uniform(UInt32(to - from)) + UInt32(from))
}
}
私はパーティーに遅刻したのですか????????
あなたがその場で配列のサイズと範囲選択を変えることを可能にする関数を使うことは最も多用途の方法です。 mapも使えますのでとても簡潔です。私は自分のパフォーマンステストやベンチマーキングのすべてにそれを使っています。
elements
は、配列内の項目数です0...max
からの数字のみを含む
func randArr(_ elements: Int, _ max: Int) -> [Int] {
return (0..<elements).map{ _ in Int.random(in: 0...max) }
}
コードセンス/プレースホルダはこのように見えます。 randArr(elements: Int, max: Int)
私の配列の0から1000までの範囲の10個の要素。
randArr(10, 1000) // [554, 8, 54, 87, 10, 33, 349, 888, 2, 77]
Swiftを使って乱数または乱数列をコード化することができます:)
let quotes: NSArray = ["R", "A", "N", "D", "O", "M"]
let randomNumber = arc4random_uniform(UInt32(quotes.count))
let quoteString = quotes[Int(randomNumber)]
print(quoteString)
ランダムに出力されます。
もう1つの選択肢は、GameKitのGKMersenneTwisterRandomSourceを使用することです。ドキュメントは言う:
メルセンヌツイスターアルゴリズムに基づいて乱数を生成する決定論的擬似乱数源。これは、信頼できるゲームプレイメカニズムを作成するのに適した決定論的ランダムソースです。 Arc4のソースよりも少し遅くなりますが、シーケンスを繰り返すまでの期間が長くなるため、よりランダムになります。決定論的ではありますが、これは暗号のランダムな情報源ではありません。ただし、ゲームプレイデータの難読化には適しています。
import GameKit
let minValue = 0
let maxValue = 100
var randomDistribution: GKRandomDistribution?
let randomSource = GKMersenneTwisterRandomSource()
randomDistribution = GKRandomDistribution(randomSource: randomSource, lowestValue: minValue, highestValue: maxValue)
let number = randomDistribution?.nextInt() ?? 0
print(number)
アップルのサンプルコードから取得した例: https://github.com/carekit-Apple/CareKit/blob/master/CareKitPrototypingTool/OCKPrototyper/CareKitPatient/RandomNumberGeneratorHelper.Swift
これは私が2 int型の間の乱数を取得する方法です!
func randomNumber(MIN: Int, MAX: Int)-> Int{
var list : [Int] = []
for i in MIN...MAX {
list.append(i)
}
return list[Int(arc4random_uniform(UInt32(list.count)))]
}
使用法:
print("My Random Number is: \(randomNumber(MIN:-10,MAX:10))")
あなたはこれを特定の割合で使うことができます:
let die = [1, 2, 3, 4, 5, 6]
let firstRoll = die[Int(arc4random_uniform(UInt32(die.count)))]
let secondRoll = die[Int(arc4random_uniform(UInt32(die.count)))]
いくつかの数字が繰り返されることを忘れないでください!だからあなたは....のような何かをする必要があります.
私のtotalQuestionsは47でした。
func getRandomNumbers(totalQuestions:Int) -> NSMutableArray
{
var arrayOfRandomQuestions: [Int] = []
print("arraySizeRequired = 40")
print("totalQuestions = \(totalQuestions)")
//This will output a 40 random numbers between 0 and totalQuestions (47)
while arrayOfRandomQuestions.count < 40
{
let limit: UInt32 = UInt32(totalQuestions)
let theRandomNumber = (Int(arc4random_uniform(limit)))
if arrayOfRandomQuestions.contains(theRandomNumber)
{
print("ping")
}
else
{
//item not found
arrayOfRandomQuestions.append(theRandomNumber)
}
}
print("Random Number set = \(arrayOfRandomQuestions)")
print("arrayOutputCount = \(arrayOfRandomQuestions.count)")
return arrayOfRandomQuestions as! NSMutableArray
}