Project1

标题: 随机一个从n到m的数,如何让数越大随机到的概率就越低。 [打印本页]

作者: 我为鱼肉    时间: 2023-1-12 11:20
标题: 随机一个从n到m的数,如何让数越大随机到的概率就越低。
本帖最后由 我为鱼肉 于 2023-1-13 16:35 编辑

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



已经解决,这是我按照菜刀提供的思路,定义的方法(比用数组或许能快一点点吧)。
RUBY 代码复制
  1. module Kernel
  2.   def random(range)
  3.     first = range.first
  4.     last = range.exclude_end? ? range.last - 1 : range.last
  5.     max = (last - first + 1) * (first + last) / 2   
  6.     result = rand(max) + 1
  7.     for i in range
  8.       small = i > first ? ((i - first) * (first + i - 1) / 2) : 0
  9.       large = i > first ? ((i - first + 1) * (first + i) / 2) : first
  10.       break if result > small and result <= large
  11.       #return i if result > small and result <= large
  12.     end
  13.     return last - i + first
  14.   end
  15. end
  16. #代码测试
  17. a = []
  18. 1000.times{
  19. r = random(20..40)
  20. if a[r].nil?
  21.   a[r] = 0
  22. end
  23. a[r] += 1
  24. }
  25. a.delete(nil)
  26. p a
  27. exit

作者: 灯笼菜刀王    时间: 2023-1-12 11:53
f = []
max = m + 1
for i in n..m
  (max - i).times{f.push(i)}
end
p f[rand(f.size)]
作者: guoxiaomi    时间: 2023-1-12 17:37
使用非线性映射就行:y = (rand(x) ** 0.5 * (M - N) + N).to_i,只要函数相对y = x上凸就行




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1