【问题标题】:Generating random Int array of random count without repeated vars [duplicate]生成随机计数的随机 Int 数组而不重复变量 [重复]
【发布时间】:2018-07-03 10:26:59
【问题描述】:

代码首先生成一个介于 0-8 之间的随机数,并将其分配给 var n。然后第二个 randomNumber Generator 函数循环 n 次以生成 n 个介于 0 和 10 之间的整数,所有整数都具有不同的发生概率并最终放入数组中。我想要的是这 10 个可能的数字都不重复,所以一旦选择了一个,它就不能再被其他 n-1 次运行 func 选择。我正在考虑重复循环或 if 语句或涉及索引的东西,但我不知道具体如何,也不知道在什么括号内。谢谢你的帮助!有人说这是地球上最具挑战性和最智能的编码难题。接受挑战了吗?

import UIKit

let n = Int(arc4random_uniform(8))

var a:Double = 0.2
var b:Double = 0.3
var c:Double = 0.2
var d:Double = 0.3
var e:Double = 0.2
var f:Double = 0.1
var g:Double = 0.2
var h:Double = 0.4
var i:Double = 0.2
var j:Double = 0.2
var k: [Int] = []

for _ in 0...n {
    func randomNumber(probabilities: [Double]) -> Int {
        let sum = probabilities.reduce(0, +)
        let rnd = sum * Double(arc4random_uniform(UInt32.max)) / Double(UInt32.max)
        var accum = 0.0
        for (i, p) in probabilities.enumerated() {
            accum += p
            if rnd < accum {
                return i
            }}
        return (probabilities.count - 1)
    }
    k.append(randomNumber(probabilities: [a, b, c, d, e, f, g, h, i, j]))
}
print(k)

【问题讨论】:

  • 我可以告诉你伪代码,如果你想要或者一个合适的 python 代码
  • 是的,请!....
  • 伪代码.....
  • 你的例子有问题。您的十个数字(a 到 j)只有四个值:0.1、0.2、0.3、0.4。一旦您选择了这四个值,那么第五个选择必须重复。根据您的条件,最多不可能得到 8 个数字。
  • 否,因为这些值成为 var 发生的概率。运行时,输出的是整数 0-10

标签: swift xcode random probability repeat


【解决方案1】:

伪代码 -

1)generate a number between 1-8
    n
2)take empty array
    arr[]
3)loop from 0 to n
    1) generate a random no
        temp
    2) check if it is there in arr
            > if it is there in arr, generate another
    3) when you get a number which is not there in arr, insert it

这是一个python代码

import random

n = random.randint(1,8)
arr = []
print(n)
for each in range(n):
    temp = random.randint(1, 10)
    while temp in arr:
        temp = random.randint(1, 10)
        print(temp)
    arr.append(temp)
print(arr)

查看代码示例here

【讨论】:

    【解决方案2】:

    Swift 版本的 Ankush 的回答 -

     let n = arc4random_uniform(7) + 1
     var arr: [UInt32] = []
     for _ in 0 ... n {
        var temp = arc4random_uniform(9) + 1
        while arr.contains(temp) {
            temp = arc4random_uniform(9) + 1
        }
        print(temp)
        arr.append(temp)
     }
    print(arr)
    

    希望这会有所帮助!

    【讨论】:

    • 确实如此!我能问一下你为什么用 arc4random_uniform(7) + 1 而不是 (8) 吗?
    • 因为 arc4random_uniform(7) 生成 0 到 7 之间的随机数
    • 你能帮帮我吗?我不明白如何将这两种方法交织在一起。我的给了我基于概率的新数组,但他们重复了,你给的那个不重复但不包含概率
    猜你喜欢
    • 2015-07-12
    • 2016-05-05
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多