查看: 2415|回复: 2

[已经解决] 随机一个从n到m的数,如何让数越大随机到的概率就越低。

[复制链接]
梦石
0
星屑
2821
在线时间
585 小时
注册时间
2022-7-13
回帖
81
发表于 2023-1-12 11:20:17 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 我为鱼肉 于 2023-1-13 16:35 编辑

随机一个从n到m的数,如何让数越大随机到的概率就越低。



已经解决,这是我按照菜刀提供的思路,定义的方法(比用数组或许能快一点点吧)。
[pre lang="ruby"]module Kernel
  def random(range)
    first = range.first
    last = range.exclude_end? ? range.last - 1 : range.last
    max = (last - first + 1) * (first + last) / 2   
    result = rand(max) + 1
    for i in range
      small = i > first ? ((i - first) * (first + i - 1) / 2) : 0
      large = i > first ? ((i - first + 1) * (first + i) / 2) : first
      break if result > small and result <= large
      #return i if result > small and result <= large
    end
    return last - i + first
  end
end
#代码测试
a = []
1000.times{
r = random(20..40)
if a[r].nil?
  a[r] = 0
end
a[r] += 1
}
a.delete(nil)
p a
exit
[/pre]
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2023-1-12 11:53:58 | 显示全部楼层
f = []
max = m + 1
for i in n..m
  (max - i).times{f.push(i)}
end
p f[rand(f.size)]

评分

参与人数 3星屑 +50 赞 +2 收起 理由
RyanBern + 50 认可答案
taeckle + 1 精品文章
我为鱼肉 + 1 确实可以

查看全部评分

回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2023-1-12 17:37:57 | 显示全部楼层
使用非线性映射就行:y = (rand(x) ** 0.5 * (M - N) + N).to_i,只要函数相对y = x上凸就行

评分

参与人数 3星屑 +50 赞 +2 收起 理由
RyanBern + 50 认可答案
taeckle + 1 我很赞同
我为鱼肉 + 1 贫瘠的数学知识表示看不懂

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 1 0

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部