したがって、このcodebitにおける私の目標は、2つのサイコロをランダムに振ることであり、私たち全員があなたの通常のサイコロに6面しかないことを知っているのでランダムに0になるのを避けるために(1..7)の範囲を使用しようとしましたが、あまりにも楽しまなかったエラーが返されました。私はこれをやろうとしました:
dice1 = arc4random_uniform(UInt32(1..7))
しかし戻った
指定された引数を受け入れる 'init'のオーバーロードが見つかりませんでした
私はこれが私を助けるためにそこにあなたの素晴らしいデビューのための十分な情報であることを願っています:)
私はただSwiftを練習するために遊び場でこれをやっていることに注意してください。私がこれを行う方法を学ぶことは必須ではありません。実際のアプリケーションを構築する前に、私はちょっと手を加えています。D
//imports random number function
import Foundation
//creates data storage for dice roll
var dice1: UInt32 = 0
var dice2: UInt32 = 0
//counter variable
var i = 0
//how many times snake eyes happens
var snakeeyes = 0
//how many times a double is rolled
var `double` = 0
//rolls dice 100 times
while i < 100{
//from here
//sets dice roll
これは 'Range $ T3'のエラーを返しますUInt32に変換できません
dice1 = arc4random_uniform(1..7) dice2 = arc4random_uniform(1..7)
//checks for snake eyes
if dice1 == 1 && dice2 == 1 {
snakeeyes = snakeeyes + 1
}
//checks for doubles
if dice1 == dice2{
`double` = `double` + 1
}
//increases counter
i = i + 1
//to here
}
println("You got Snake Eyes \(snakeeyes) times.")
println("You got Doubles, \(`double`) times.")
私はあなたがすべきだと思います
dice1 = arc4random_uniform(6) + 1;
1 - 6の範囲を得るために。私はiOS Objective CをやっていないしSwift言語についての知識も持っていない。 randomメソッドは0から5までの値を返すべきで、+ 1はそれを1から6までの値にします。
あなたが間の範囲が必要な場合は、10 - 30と言ってみましょうそれからちょうど
int random = arc4random_uniform(21) + 10;
私はInt型の拡張子を作りました。遊び場でそれをテストした、これが有用であることを願っています。負の範囲も受け入れます。
extension Int
{
static func random(range: Range<Int> ) -> Int
{
var offset = 0
if range.startIndex < 0 // allow negative ranges
{
offset = abs(range.startIndex)
}
let mini = UInt32(range.startIndex + offset)
let maxi = UInt32(range.endIndex + offset)
return Int(mini + arc4random_uniform(maxi - mini)) - offset
}
}
のように使う
var aRandomInt = Int.random(-500...100) // returns a random number within the given range.
または、このようにプロパティとしてRange拡張として定義します。
extension Range
{
var randomInt: Int
{
get
{
var offset = 0
if (startIndex as Int) < 0 // allow negative ranges
{
offset = abs(startIndex as Int)
}
let mini = UInt32(startIndex as Int + offset)
let maxi = UInt32(endIndex as Int + offset)
return Int(mini + arc4random_uniform(maxi - mini)) - offset
}
}
}
// usage example: get an Int within the given Range:
let nr = (-1000 ... 1100).randomInt
かなり良い答えがいくつかありますが、私の個人的なお気に入りのSwift乱数生成関数を正の整数で共有したいと思いました。
func randomNumber(range: Range<Int> = 1...6) -> Int {
let min = range.startIndex
let max = range.endIndex
return Int(arc4random_uniform(UInt32(max - min))) + min
}
これがSwift 3のクイックアップデートです。ボーナスとして、SignedIntegerプロトコルに準拠した任意の値型に対して機能するようになりました - Int16、Int32などを指定する必要があるコアデータアプリケーションにははるかに便利です。符号なし整数でも機能するためには本当に必要で、単に関数全体をコピーしてからSignedInteger
をUnsignedInteger
に、そしてtoIntMax()
をtoUIntMax()
に置き換えるだけです。
func randomNumber<T : SignedInteger>(inRange range: ClosedRange<T> = 1...6) -> T {
let length = (range.upperBound - range.lowerBound + 1).toIntMax()
let value = arc4random().toIntMax() % length + range.lowerBound.toIntMax()
return T(value)
}
Swift 4ではtoIntMax()が削除されたため、今度は共通の整数型に変換するための別の方法を使用する必要があります。この例では、私の目的には十分大きいInt64を使用していますが、符号なし整数を使用している場合、またはInt128またはInt256のカスタム型を使用している場合は、それらを使用する必要があります。
public func randomNumber<T : SignedInteger>(inRange range: ClosedRange<T> = 1...6) -> T {
let length = Int64(range.upperBound - range.lowerBound + 1)
let value = Int64(arc4random()) % length + Int64(range.lowerBound)
return T(value)
}
もう1つ、全体のランダムファイルについては、任意のCollection
型オブジェクトからランダムな要素を返す拡張子です。これは、インデックスを生成するために上記の関数を使用するので、両方が必要になります。
extension Collection {
func randomItem() -> Self.Iterator.Element {
let count = distance(from: startIndex, to: endIndex)
let roll = randomNumber(inRange: 0...count-1)
return self[index(startIndex, offsetBy: roll)]
}
}
randomNumber()
は1から6の間の乱数を返します。
randomNumber(50...100)
は50から100までの数値を返します。当然、50と100の値を好きなものに置き換えることができます
残念なことに、私の最善のStackOverflow回答はついに時代遅れになりました。与えられた範囲で乱数を生成するためにInt.random(in: 1 ... 6)
を使うことができます。他の形式の整数や浮動小数点数に対しても機能します。コレクション型はshuffle()
とrandomElement()
関数も提供します。したがって、特定のランダマイザータイプを使用したいのでなければ、もはや空想ランダム化関数は必要ありません。
Swift 4.2によると、このように乱数を取得するのは簡単です。
let randomDouble = Double.random(in: -7.9...12.8)
let randomIntFrom0To10 = Int.random(in: 0 ..< 10)
あなたが私がそれを作成したいのであれば乱数これはIntとDouble、Floatの拡張です。
/**
Arc Random for Double and Float
*/
public func arc4random <T: IntegerLiteralConvertible> (type: T.Type) -> T {
var r: T = 0
arc4random_buf(&r, UInt(sizeof(T)))
return r
}
public extension Int {
/**
Create a random num Int
:param: lower number Int
:param: upper number Int
:return: random number Int
By DaRkDOG
*/
public static func random (#lower: Int , upper: Int) -> Int {
return lower + Int(arc4random_uniform(upper - lower + 1))
}
}
public extension Double {
/**
Create a random num Double
:param: lower number Double
:param: upper number Double
:return: random number Double
By DaRkDOG
*/
public static func random(#lower: Double, upper: Double) -> Double {
let r = Double(arc4random(UInt64)) / Double(UInt64.max)
return (r * (upper - lower)) + lower
}
}
public extension Float {
/**
Create a random num Float
:param: lower number Float
:param: upper number Float
:return: random number Float
By DaRkDOG
*/
public static func random(#lower: Float, upper: Float) -> Float {
let r = Float(arc4random(UInt32)) / Float(UInt32.max)
return (r * (upper - lower)) + lower
}
}
SE:
let randomNumDouble = Double.random(lower: 0.00, upper: 23.50)
let randomNumInt = Int.random(lower: 56, upper: 992)
let randomNumInt =Float.random(lower: 6.98, upper: 923.09)
func randomNumber(range: ClosedRange<Int> = 1...6) -> Int {
let min = range.lowerBound
let max = range.upperBound
return Int(arc4random_uniform(UInt32(1 + max - min))) + min
}
これはarc4random_uniform()が次のように定義されているからです。
func arc4random_uniform(_: UInt32) -> UInt32
それは入力としてUInt32を取り、UInt32を吐き出します。あなたはそれに値の範囲を渡そうとしています。 arc4random_uniformを指定すると、0からそれまでに渡した数(排他的)の間の乱数が得られます。たとえば、[-50, 50]
のように-50から50の間の乱数を見つけたい場合は、arc4random_uniform(101) - 50
を使用できます。
迅速:
var index = 1 + random() % 6
Swift 2.0で動作するように@ DaRk -_- D0Gの回答を変更しました
/**
Arc Random for Double and Float
*/
public func arc4random <T: IntegerLiteralConvertible> (type: T.Type) -> T {
var r: T = 0
arc4random_buf(&r, sizeof(T))
return r
}
public extension Int {
/**
Create a random num Int
:param: lower number Int
:param: upper number Int
:return: random number Int
By DaRkDOG
*/
public static func random (lower: Int , upper: Int) -> Int {
return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
}
}
public extension Double {
/**
Create a random num Double
:param: lower number Double
:param: upper number Double
:return: random number Double
By DaRkDOG
*/
public static func random(lower: Double, upper: Double) -> Double {
let r = Double(arc4random(UInt64)) / Double(UInt64.max)
return (r * (upper - lower)) + lower
}
}
public extension Float {
/**
Create a random num Float
:param: lower number Float
:param: upper number Float
:return: random number Float
By DaRkDOG
*/
public static func random(lower: Float, upper: Float) -> Float {
let r = Float(arc4random(UInt32)) / Float(UInt32.max)
return (r * (upper - lower)) + lower
}
}
答えはたった1行のコードです。
let randomNumber = arc4random_uniform(8999) + 1000 //for 4 digit random number
let randomNumber = arc4random_uniform(899999999) + 100000000 //for 9 digit random number
let randomNumber = arc4random_uniform(89) + 10 //for 2 digit random number
let randomNumber = arc4random_uniform(899) + 100 //for 3 digit random number
代替解決策は次のとおりです。
func generateRandomNumber(numDigits: Int) -> Int{
var place = 1
var finalNumber = 0;
var finanum = 0;
for var i in 0 ..< numDigits {
place *= 10
let randomNumber = arc4random_uniform(10)
finalNumber += Int(randomNumber) * place
finanum = finalNumber / 10
i += 1
}
return finanum
}
欠点はその数が0から始まらないことです。
スウィフトでは...
これは包括的です。random(1,2)
を呼び出すと1または2が返されます。これは負の数でも機能します。
func random(min: Int, _ max: Int) -> Int {
guard min < max else {return min}
return Int(arc4random_uniform(UInt32(1 + max - min))) + min
}
編集:Swift 4.2以降でこれが可能になりました。
(100...200).randomElement()
Range
を拡張するのは私にとって慣用的なことです。
public extension Range where Bound == Int {
var random: Int {
return lowerBound + Int(arc4random_uniform(UInt32(upperBound - lowerBound)))
}
}
public extension ClosedRange where Bound == Int {
var random: Int {
return lowerBound + Int(arc4random_uniform(UInt32(upperBound - lowerBound + 1)))
}
}
使用中で:
let foo = (100..<600).random
Swift 4.2以降:
Int {
public static func random(in range: ClosedRange<Int>) -> Int
public static func random(in range: Range<Int>) -> Int
}
のように使われる:
Int.random(in: 2...10)
次のコードを使用して乱数の作成に成功しました。
var coin = arc4random_uniform(2) + 1
これがお役に立てば幸いです。
Swift 4/Xcode 9 +を使ってTed van Gaalenの答えからRange
拡張の少し更新されたバージョンがおそらく役に立つと思うでしょう。
extension CountableClosedRange where Bound == Int {
var randomFromRange: Bound {
get {
var offset = 0
if lowerBound < 0 {
offset = abs(lowerBound)
}
let mini = UInt32(lowerBound + offset)
let maxi = UInt32(upperBound + offset)
return Int(mini + arc4random_uniform(maxi - mini)) - offset
}
}
}
let n = (-1000 ... 1000).randomFromRange
print(n)
あるいは、これはオープンとクローズのインターバルをサポートするための少々「ハックな」解決策です。
extension CountableRange where Bound == Int {
var randomFromRange: Bound {
return uniformRandom(from: lowerBound, to: upperBound)
}
}
extension CountableClosedRange where Bound == Int {
var randomFromRange: Bound {
return uniformRandom(from: lowerBound, to: upperBound - 1)
}
}
func uniformRandom(from: Int, to: Int) -> Int {
var offset = 0
if from < 0 {
offset = abs(from)
}
let mini = UInt32(from + offset)
let maxi = UInt32(to + offset)
return Int(mini + arc4random_uniform(maxi - mini)) - offset
}
両方の種類の区間に同時にプロパティを追加する方法があるかどうかわかりません。
Swift 3 Xcode Beta 5 Solution Ted van Gaalen Answerに基づいています。
extension Int
{
static func random(range: Range<Int> ) -> Int
{
var offset = 0
if range.lowerBound < 0 // allow negative ranges
{
offset = Swift.abs(range.lowerBound)
}
let mini = UInt32(range.lowerBound + offset)
let maxi = UInt32(range.upperBound + offset)
return Int(mini + arc4random_uniform(maxi - mini)) - offset
}
}
var rangeFromLimits = arc4random_uniform((UPPerBound - LOWerBound)+ 1))+ LOWerBound;
これがうまくいくことを願います。arc4random_uniform()の範囲内で乱数を作成しますか?
var randomNumber = Int(arc4random_uniform(6))
print(randomNumber)