gpt4 book ai didi

Ruby Split number in ones or halves

转载 作者:数据小太阳 更新时间:2023-10-29 08:16:12 44 4
gpt4 key购买 nike

我喜欢将分数拆分为 n 个位置的数组。

假设我的分数是 11,数组的大小是 12。然后我喜欢有一些数组,例如 11 个或 10 个和 2 个一半(0.5)。最后它应该总和为 11。

那么可能的分数是:

size = 12
possible_scores = (0..size).step(0.5).to_a

我可以创建一个包含 12 个位置的数组:

scores = Array.new(size) {0}

我可以从以下可能值中选择一个随机值:

[0, 0.5, 1].sample

我正在寻找一种检索随机数组的有效方法,如果可能的话,它不会有很多状态变量。我已经尝试在 while 循环中执行此操作:

while score < 0

并用随机值减少 score 的值,并跟踪设置的数组位置。但它变成了一段相当困惑的代码。

有什么解决办法吗?谢谢!

编辑:

对于这个例子,我想要一个总和为 11 的数组。所以任何一个

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] 

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0.5]

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1]

或任何总和为 11 的组合。

最佳答案

参数和变量

给定:

  • tot ,所需总数,0.5 的整数或奇数倍;和
  • size , 总数0的,0.5的和1是总数tot ,要求 size >= tot .

我们定义三个变量:

  • n0等于零的数量;
  • n0pt5_pairs等于 0.5 的对数的;和
  • n1等于个数。

案例 1:tot是一个整数

我们要求:

0 <= n0pt5_pairs <= [tot, size-tot].min

请注意,因为 n1 = tot - n0pt5_pairs , 2 * n0pt5_pairs + n1 = n0pt5_pairs + tot > size如果n0pt5_pairs > size-tot .即总数0.5的和那些超过了size如果 0.5 的数量对超过 size-tot .

给定 n0pt5_pairs 的值满足上述要求,n0n1确定:

n1 = tot - n0pt5_pairs
n0 = size - 2*n0pt5_pairs - n1
= size - tot - n0pt5_pairs

因此我们可以随机选择一个随机三元组 [n0, 2*n0pt5_pairs, n1]如下:

def random_combo(size, tot)
n0pt5_pairs = rand(1+[tot, size-tot].min)
[size-tot-n0pt5_pairs, 2*n0pt5_pairs, tot-n0pt5_pairs]
end

例如:

arr = random_combo(17, 11)
#=> [3, 6, 8]

这个用来生成数组

arr1 = [*[0]*arr[0], *[0.5]*arr[1], *[1]*arr[2]]
#=> [0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 1, 1, 1, 1, 1, 1]

我们洗牌:

arr1.shuffle
#=> [1, 0, 0.5, 1, 0.5, 0, 1, 1, 0, 1, 1, 1, 0.5, 0.5, 1, 0.5, 0.5]

备注arr1.size #=> 17arr.sum #=> 11 .

案例 2:tot是0.5的倍数

如果

tot = n + 0.5

哪里n是一个整数,0的每一个组合的,0.5的和1的至少有一个 0.5 .因此,我们可以计算出 0 的数量。的和1的,以及 0.5 的数量的超过一个。为此,我们只需减少 tot通过 0.5 (使其等于一个整数)和size一个,使用generate_for_integer要解决该问题,则对于该方法返回的每个三元素数组,增加 0.5 的数量一个。

def generate(size, tot)
return nil if size.zero?
is_int = (tot == tot.floor)
tot = tot.floor
size -= 1 unless is_int
n0pt5_pairs = rand(1+[tot, size-tot].min)
[*[0]*(size-tot-n0pt5_pairs), *[0.5]*(2*n0pt5_pairs + (is_int ? 0 : 1)),
*[1]*(tot-n0pt5_pairs)].
shuffle
end

ge = generate(17, 10)
#=> [0, 1, 0, 1, 0.5, 0.5, 0, 0.5, 0.5, 1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5]
ge.size #=> 17
ge.sum #=> 10.0

go = generate(17, 10.5)
#=> [0.5, 0.5, 0.5, 1, 0, 0.5, 0.5, 1, 1, 0.5, 1, 1, 0.5, 1, 0.5, 0.5, 0]
go.size #=> 17
go.sum #=> 10.5

关于Ruby Split number in ones or halves,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55936384/

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