gpt4 book ai didi

arrays - 在 Swift 4.1 中,如何打乱或随机化一个数组,使生成的数组的元素总和始终等于固定值?

转载 作者:行者123 更新时间:2023-11-28 14:07:12 29 4
gpt4 key购买 nike

我正在尝试打乱一组数字,然后将生成的随机数组存储在一个变量中。但我希望生成的随机数组中的元素总和为 1。

var numbers = [1,0.5,0.25,0.125,0.0625]
var newTime = [Double]()
var x = numbers.shuffled()

for _ in 0..<x.count {
newTime.append(x.random_element())
}
var sum = newTime.reduce(0, +)
for _ in 0..<newTime.count {
if sum == 1 {
print("Final Sum: \(newTime)")
}
if sum > 1 {
let rand = Int(arc4random_uniform(UInt32(newTime.count)))
newTime.remove(at: rand)
} else if sum < 1 {
newTime.append(x.random_element())
}
}

编辑:(根据邓肯的建议)

var numbers = [1,0.5,0.25,0.125,0.0625]
var newTime = [Double]()
var x = numbers.shuffled()

for _ in 0..<x.count {
newTime.append(x.random_element())
}
var sum = newTime.reduce(0, +)
newTime.append(1.0 - sum)
print(newTime)

只要 (1.0-sum) 是正数,这个方法就有效。在这种情况下,一个正数将附加到数组,使数组中所有元素的总和 =1.0。但是,如果 (1.0-sum) 是一个负数,那么它对我不起作用,因为生成的 newTime 数组将包含该数组中所有先前的元素加上一个负数,基本上总和为 1.0。在这种情况下,生成的 newTime = [0.125, 0.25, 0.0625, 1.0, 1.0, -1.4375]。而我期望 newTime = [1.0] 因为其余元素的总和是 1.4375,因此,我需要将它们从 newTime 数组中删除。

希望我能把事情解释清楚。

最佳答案

你的目标很困惑,你的代码也没有多大意义。你说你想打乱一个数组,但你又说你希望数组中元素的总和总是加起来为 1。数组中元素的顺序对总和没有影响。听起来您想创建一个总和为 1.0 的随机浮点值数组,然后您想对其进行随机化处理。

这是两个不同的东西。

如果您使用的是 Swift 4.2,您可以创建一个总和为 1.0 的对象数组,如下所示:

var array = [Double]()

//create an array of values ranging from -2.0 to 2.0
for _ in 1...10 {
array.append(Double(Int.random(in: -2000...2000))/1000.0)
}
let sum = array.reduce(0, +)

//Add one more value that brings the sum of the array contents to ≈ 1.0
array.append(1.0 - sum)

然后只需使用即可打乱数组

array.shuffle()

由于 float 的限制,数组的总和可能不是正好 1。您可能会得到类似 0.99999999998 或 1.0000000004 的值,但如果您将总和四舍五入到小数点后 3 位,它将为 1.000

关于arrays - 在 Swift 4.1 中,如何打乱或随机化一个数组,使生成的数组的元素总和始终等于固定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52883828/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com