programing

arc4random_uniform()의 범위 사이에 난수를 어떻게 만들 수 있습니까?

easyjava 2023. 4. 29. 09:59
반응형

arc4random_uniform()의 범위 사이에 난수를 어떻게 만들 수 있습니까?

그래서 이 코드비트에서 제 목표는 두 개의 주사위를 무작위로 굴리는 것이고 우리 모두가 알다시피 당신의 일반 다이는 6개의 면만 가지고 있기 때문에 저는 arc4random_uniform(UINT32)에 액세스하기 위한 Foundation을 가져왔습니다.무작위로 0이 되는 것을 피하기 위해 (1..7) 범위를 사용하려고 했지만 너무 즐기지 않는 오류가 반환되었습니다.저는 이것을 하려고 했습니다.

dice1 = arc4random_uniform(UInt32(1..7))

그러나 그것은 되돌아왔습니다.

제공된 인수를 수락하는 'init'에 대한 오버로드를 찾을 수 없습니다.

저는 이것이 저를 돕기 위해 밖에 있는 놀라운 뎁들에게 충분한 정보이기를 바랍니다 :)

운동장에서 빨리 연습하려고 하는 거예요.이것을 배우는 것이 필수적인 것은 아닙니다. 실제 앱을 구축하기 전에 손을 대는 것뿐입니다.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

이는 '범위 $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 목표 C를 하지도 않고 빠른 언어에 대한 지식도 없습니다.랜덤 방법은 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.

또는 다음과 같은 속성으로 범위 확장으로 정의합니다.

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

꽤 좋은 답변들이지만, 저는 제가 개인적으로 좋아하는 양의 정수에 대한 스위프트 난수 생성 함수를 공유하고 싶었습니다.

스위프트 2

func randomNumber(range: Range<Int> = 1...6) -> Int {
    let min = range.startIndex
    let max = range.endIndex
    return Int(arc4random_uniform(UInt32(max - min))) + min
}

스위프트 3

Swift 3에 대한 빠른 업데이트가 있습니다. 보너스로, 이제 Signed Integer 프로토콜을 준수하는 모든 값 유형에 대해 작동합니다. 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)
}

스위프트 4

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)
}

더,총파일에 의 하더나, 총랜파에대, 임를요반확해있가다, 습니는하장자환에서 임의의 요소를 .Collectionobject.type 체객.위의 함수를 사용하여 인덱스를 생성하므로 둘 다 필요합니다.

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의 값을 원하는 대로 바꿀 수 있습니다.

스위프트 4.2

아아, 나의 최고의 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
    }
}

사용:

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)

스위프트 3/4:

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를 뱉습니다. 0사이의 하고 (를 제공하기 에, 를 들어arc4_uniform과 같이 50 . 따라서 예를 들어, 예를 들어, -50과 50 사이의 임의의 숫자를 찾고자 했습니다.[-50, 50]당신은 사용할 수 있습니다.arc4random_uniform(101) - 50

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
    }
}

스위프트:

var index = 1 + random() % 6

신속하게...

여기에는 전화가 포함됩니다.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
    }

정답은 라인 코드 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부터 시작할 수 없다는 것이 단점입니다.

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)

편집: 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

다음 코드를 사용하여 난수 생성을 성공적으로 완료했습니다.

var coin = arc4random_uniform(2) + 1

이것이 당신에게 도움이 되길 바랍니다.

Swift 3 Xcode 베타 5 솔루션.Ted van Gaalen 답변을 기반으로 합니다.

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 range From Limits = arc4px_uniform((UPPERBound - LOWERBound) + 1) + LOWERBound;

이것이 작동하기를 바랍니다. arc4random_uniform()의 범위 사이에 난수를 만드시겠습니까?

var randomNumber = Int(arc4random_uniform(6))
print(randomNumber)

아마도 이 약간 업데이트된 버전의 유용한 것을 발견할 것입니다.RangeSwift 4/Xcode 9+사용한 Ted van Gaalen의 답변에서 확장:

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
}

두 유형의 구간에 동시에 속성을 추가할 수 있는 방법이 있는지 확실하지 않습니다.

언급URL : https://stackoverflow.com/questions/24132399/how-does-one-make-random-number-between-range-for-arc4random-uniform

반응형