所以我在这个代码中的目标是随机掷两个骰子,因为我们都知道你的普通骰子只有6个边,所以我导入了Foundation to arc4random_uniform(UInt32)。我尝试使用(1..7)的范围来避免随机得到0,但是这返回了一个我不太喜欢的错误。我试着这样做:
dice1 = arc4random_uniform(UInt32(1..7))
然而,返回的
找不到接受所提供参数的“init”的重载
我希望这些信息对你们这些令人惊叹的deb有足够的帮助:)
请注意,我只是在操场上练习迅捷。我并不一定要学习如何做到这一点;我只是在开始构建实际的应用程序之前修修补补: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.")
发布于 2014-06-10 12:00:00
我相信你应该这样做
dice1 = arc4random_uniform(6) + 1;
为了得到1- 6的范围。我不做iOS对象C,也没有任何关于swift语言的知识。随机方法应该返回一个介于0和5之间的值,而+1将使其成为介于1和6之间的值。
如果您需要一个介于10 - 30之间的范围,那么只需这样做
int random = arc4random_uniform(21) + 10;
发布于 2014-10-01 19:26:57
我做了一个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
}
}
使用like
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
发布于 2015-04-12 14:03:22
有很多不错的答案,但我只想分享我个人最喜欢的正整数Swift随机数生成函数:
斯威夫特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
}
Swift 3
这是Swift 3的一个快速更新,作为一个额外的好处,它现在适用于任何符合SignedInteger协议的值类型-对于需要指定Int16,Int32等的核心数据应用程序来说要方便得多。如果你真的需要它来处理无符号整数,只需复制整个函数,然后用UnsignedInteger
替换SignedInteger
,用toUIntMax()
替换toIntMax()
。
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自定义类型,则应该使用这些类型。
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
类型的对象中返回一个随机元素。注意,这使用了上面的函数来生成它的索引,所以您需要这两个函数。
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)的数字。当然,您可以将值50和100替换为您喜欢的任何值。
Swift 4.2
遗憾的是,我最好的StackOverflow答案终于过时了。现在,您可以简单地使用Int.random(in: 1 ... 6)
在给定范围内生成一个随机数。也适用于其他形式的整数和浮点数。集合类型现在还提供了shuffle()
和randomElement()
函数。因此,除非您想使用特定的随机化器类型,否则不再需要任何花哨的随机化函数。
https://stackoverflow.com/questions/24132399
复制相似问题