没有连续两次有大量的重复创建一个随机数数组(Create a random number array

2019-10-23 12:50发布

我是新来的这一切,所以我希望这是有道理的。 我想显示时无需具有相同图像被按下的按钮随机图像连续出现两次。 我发现在这个网站与帮助回答类似的问题,但我仍然得到我的代码中的错误,我不明白。

下面是在类顶下我的图像阵列的代码:

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

下面是我使用的按钮IBAction为下随机数的代码(也有可能是这个错误,我不知道的,就像我说我之前是一个小白)

 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]

它说

“不能与类型的索引,订阅类型‘[字符串]’的值‘(UInt32的) - > INT’

Answer 1:

这将很好地工作:

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

正如你可以在你的函数声明见func randomNumber(maximum: UInt32) -> Int ,这意味着你的函数接受参数maximum是的类型UInt32和返回Int

但是,您使用的功能就像self.imageArray[randomNumber]要由访问一个元素imageArrayrandomNumber功能。

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

你可以改变你的最大值根据自己的需要。



Answer 2:

如果你不希望随机项重复,你可以删除它,接下来的抽奖如下之后追加回来:

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"


Answer 3:

随着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


文章来源: Create a random number array without having a number repeat twice in a row