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
'programing' 카테고리의 다른 글
| ASP에서 가장 좋은 방법은 무엇입니까?현재 도메인을 얻기 위한 NET? (0) | 2023.04.29 |
|---|---|
| WPF에서 문화를 설정하고 변경하는 방법 (0) | 2023.04.29 |
| Xcode 10 오류: 여러 명령이 생성됩니다. (0) | 2023.04.29 |
| C# - Excel 워크시트를 프로그래밍 방식으로 추가하는 방법 - Office XP / 2003 (0) | 2023.04.19 |
| 프레임워크가 있는 iOS 앱이 장치에서 크래시됨, dyld: 라이브러리가 로드되지 않음, Xcode 6 베타 (0) | 2023.04.19 |