首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在arc4random_uniform()的范围内生成随机数?

如何在arc4random_uniform()的范围内生成随机数?
EN

Stack Overflow用户
提问于 2014-06-10 11:32:51
回答 18查看 153.8K关注 0票数 133

所以我在这个代码中的目标是随机掷两个骰子,因为我们都知道你的普通骰子只有6个边,所以我导入了Foundation to arc4random_uniform(UInt32)。我尝试使用(1..7)的范围来避免随机得到0,但是这返回了一个我不太喜欢的错误。我试着这样做:

代码语言:javascript
复制
dice1 = arc4random_uniform(UInt32(1..7))

然而,返回的

找不到接受所提供参数的“init”的重载

我希望这些信息对你们这些令人惊叹的deb有足够的帮助:)

请注意,我只是在操场上练习迅捷。我并不一定要学习如何做到这一点;我只是在开始构建实际的应用程序之前修修补补:D

代码语言:javascript
复制
//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)

代码语言:javascript
复制
    //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.")
EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2014-06-10 12:00:00

我相信你应该这样做

代码语言:javascript
复制
dice1 = arc4random_uniform(6) + 1;

为了得到1- 6的范围。我不做iOS对象C,也没有任何关于swift语言的知识。随机方法应该返回一个介于0和5之间的值,而+1将使其成为介于1和6之间的值。

如果您需要一个介于10 - 30之间的范围,那么只需这样做

代码语言:javascript
复制
int random = arc4random_uniform(21) + 10;
票数 263
EN

Stack Overflow用户

发布于 2014-10-01 19:26:57

我做了一个Int类型的扩展。在操场上测试过,希望对你有用。它还接受负范围:

代码语言:javascript
复制
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
    }
}

使用like

代码语言:javascript
复制
var aRandomInt = Int.random(-500...100)  // returns a random number within the given range.

或者将其定义为范围扩展,如下所示:

代码语言:javascript
复制
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
票数 91
EN

Stack Overflow用户

发布于 2015-04-12 14:03:22

有很多不错的答案,但我只想分享我个人最喜欢的正整数Swift随机数生成函数:

斯威夫特2

代码语言:javascript
复制
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

这是Swift 3的一个快速更新,作为一个额外的好处,它现在适用于任何符合SignedInteger协议的值类型-对于需要指定Int16,Int32等的核心数据应用程序来说要方便得多。如果你真的需要它来处理无符号整数,只需复制整个函数,然后用UnsignedInteger替换SignedInteger,用toUIntMax()替换toIntMax()

代码语言:javascript
复制
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

由于Swift 4中删除了toIntMax(),我们现在必须使用一种不同的方法来转换为常见的整数类型。在本例中,我使用的Int64对于我的目的来说已经足够大了,但是如果您使用的是无符号整数,或者有一个Int128或Int256自定义类型,则应该使用这些类型。

代码语言:javascript
复制
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)
}

另外,对于所有的随机接口,这里有一个扩展,它从任何Collection类型的对象中返回一个随机元素。注意,这使用了上面的函数来生成它的索引,所以您需要这两个函数。

代码语言:javascript
复制
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)]
    }
}

用法

代码语言:javascript
复制
randomNumber()

返回一个介于1和6之间的随机数。

代码语言:javascript
复制
randomNumber(50...100)

返回一个介于50和100之间(包括50和100)的数字。当然,您可以将值50和100替换为您喜欢的任何值。

Swift 4.2

遗憾的是,我最好的StackOverflow答案终于过时了。现在,您可以简单地使用Int.random(in: 1 ... 6)在给定范围内生成一个随机数。也适用于其他形式的整数和浮点数。集合类型现在还提供了shuffle()randomElement()函数。因此,除非您想使用特定的随机化器类型,否则不再需要任何花哨的随机化函数。

票数 64
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24132399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档