创建一个随机数数组,而不是连续两次重复

时间:2015-06-27 05:46:18

标签: arrays xcode swift

我是所有这一切的新手,所以我希望这是有道理的。我想在按下按钮时显示随机图像,而不是连续两次出现相同的图像。我在这个网站上找到了类似的问题,答案有所帮助,但我的代码中仍然出现了我不理解的错误。

以下是类顶部的图像数组的代码:

var imageArray:[String] = ["yes", "no", "indeed", "nope", "ofCourse", "noWay"]

以下是我用于按钮 IBAction 下的随机数的代码:(可能存在错误,我不知道,就像我之前说的那样,我是一个菜鸟)< / p>

 var currentNo: UInt32 = 0

    func randomNumber(maximum: UInt32) -> Int {

        var randomNumber: UInt32

        do {
            randomNumber = (arc4random_uniform(6))
        }while currentNo == randomNumber

        currentNo = randomNumber

        return Int(randomNumber)
    }
    var imageString:String = self.imageArray [randomNumber]

    self.iPhoneImage.image = UIImage(named: imageString)

我在这一行收到错误

var imageString:String = self.imageArray [randomNumber]

它说

  

“无法使用索引类型订阅类型'[String]'的值   '(UInt32) - &gt; INT'

3 个答案:

答案 0 :(得分:1)

如果您不希望随机项重复,可以将其删除并在下一次抽奖后追回,如下所示:

var imageArray: [String] = ["yes", "no", "indeed", "nope", "ofCourse", "noWay"]
var random: Int {
    return Int(arc4random_uniform(UInt32(imageArray.count)))
}
var lastImage = ""
var imageName: String {
    let newImage = imageArray.removeAtIndex(random)
    if lastImage != "" {
        imageArray.append(lastImage)
    }
    lastImage = newImage
    return newImage
}

<强>测试

println(imageName)  // "ofCourse"
println(imageName)  // "no"
println(imageName)  // "yes"
println(imageName)  // "nope"
println(imageName)  // "indeed"
println(imageName)  // "noWay" 
println(imageName)  // "ofCourse"
println(imageName)  // "noWay
println(imageName)  // "nope"
println(imageName)  // "ofCourse"
println(imageName)  // "noWay"
println(imageName)  // "yes"
println(imageName)  // "ofCourse"
println(imageName)  // "indeed"
println(imageName)  // "yes"
println(imageName)  // "nope"
println(imageName)  // "noWay"
println(imageName)  // "no"
println(imageName)  // "noWay"

答案 1 :(得分:0)

这样可以正常工作:

var imageString:String = self.imageArray[randomNumber(6)]

正如您在函数声明func randomNumber(maximum: UInt32) -> Int中看到的那样,这意味着您的函数接受maximum类型的UInt32并返回Int

但您正在使用self.imageArray[randomNumber]之类的功能,您想要使用imageArray功能访问randomNumber中的元素。

但是你的函数接受你没有分配的参数,所以你可以这样使用你的函数randomNumber(6),其中6是最大值。

您可以根据需要更改最大值。

答案 2 :(得分:0)

GameKit实际上有一个内置的随机发行版为你做这个,同时仍然是统一的,非常随机的:

import GameplayKit

let imageArray = ["yes", "no", "indeed", "nope", "ofCourse", "noWay"]

let randomDistribution = GKShuffledDistribution(lowestValue: 0, highestValue: imageArray.count - 1)

func randomItem() -> String {
    return imageArray[randomDistribution.nextInt()]
}

我建议将其封装成自己的类型:

struct RandomNonRepeating<Element> {
    let values : [Element]
    let distribution : GKRandomDistribution

    init(values : [Element]) {
        self.values = values
        distribution = GKShuffledDistribution(
            lowestValue: 0, highestValue: values.count - 1)
    }

    func next() -> Element {
        return values[distribution.nextInt()]
    }
}

可以这样使用:

let x = RandomNonRepeating(values: [1, 2, 3, 4, 5])

for _ in 0...30 {
    x.next()
}

给出

4
3
2
1
5
2
4
3
1
5
4
3
2
1
5
3
1
2
4
5
4
1
3
2
5
4
3
1
2
5
3