设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2253|回复: 12
打印 上一主题 下一主题

[已经解决] 一个数值怎么随机分配成多份

[复制链接]

Lv2.观梦者

梦石
0
星屑
374
在线时间
61 小时
注册时间
2009-9-4
帖子
32
跳转到指定楼层
1
发表于 2020-10-30 10:49:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
一个数值怎么随机分配成多份,比如把数值 10 随机分成 1 3 2 3 1 这样

Lv5.捕梦者

梦石
0
星屑
38529
在线时间
5665 小时
注册时间
2006-11-10
帖子
6582
2
发表于 2020-10-30 11:58:20 | 只看该作者
本帖最后由 灯笼菜刀王 于 2020-10-30 12:01 编辑

def 拆数(n,m,type=true) #n:数值 ; m:多份, type: 拆开的数是否允许为0,默认允许
  f = []
  b = n
  t = type ? 0 : 1
  m.times do |i|
    a = (i + 1 == m) ? b : rand(b - (m - i - 1)) + t
    f.push(a)
    b -= a
  end
  return f
end

把这段随便塞进 main 前, 然后调用  p 拆数(10086,666,false)  

就可以得到你要的数组  

PS:没测试

点评

如果你只是介意大数一直在第一和第二,那你最后在大乱排序不就行了?(误)  发表于 2020-10-31 14:58
每次都是这样,所以我才说不均,如果没办法解决就算了。。  发表于 2020-10-31 11:20
前面的份随机到大数, 那后面的份的数就必然会愈来愈小啊...  发表于 2020-10-31 10:06
如例里的10086分成666,第1个值会是5000以上,第2个是2000以上,第3和4个是几百,然后剩下的600多个全是1和2.。。  发表于 2020-10-31 10:00
@小龙快追 如果会均勻, 还算是随机么? 你10分成五份, 其中一份随机到6, 那其余的份就必然是1吧?  发表于 2020-10-30 22:01
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7971
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
3
发表于 2020-10-31 15:15:34 | 只看该作者
本帖最后由 enghao_lim 于 2020-10-31 15:18 编辑

我也给出一个几乎没有效率的方法……
  1. def split(n, m, zero = false)
  2.     g = (n/m).to_i
  3.     r = []
  4.     for i in 0 ... m
  5.         if (not zero)
  6.             r.push(1)
  7.         else
  8.             r.push(0)
  9.         end
  10.     end
  11.     n -= m if not zero
  12.     while(n > 0)
  13.         for i in 0 ... m
  14.             k = rand(g + 1)
  15.             r[i] += k
  16.             n -= k
  17.             if (n < 0)
  18.                 r[i] += n
  19.             end
  20.             break if n < 0
  21.         end
  22.     end
  23.     return r
  24. end
复制代码

点评

谢谢回答  发表于 2020-11-1 11:26
这段脚本符合LZ的真正需求了~~  发表于 2020-10-31 15:32

评分

参与人数 1+1 收起 理由
alexncf125 + 1 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

4
发表于 2020-10-31 15:52:31 | 只看该作者
RUBY 代码复制
  1. def split(m, n)
  2.   h = Array.new(n-1){rand m+1} + [0, m]
  3.   h.sort!
  4.   (1..n).map{|i|h[i] - h[i-1]}
  5. end

就是0-m之间随机选几个点然后一段段拿出来
每段大小0-m随机
默认切成有0的
要是最少要1
map那里加1 开头m减n就行了

点评

谢谢,可以用,应该没问题  发表于 2020-11-1 11:25
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-2-4 00:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表