带有更高低值概率的随机数生成器?
2010-12-12 5:15:37
收藏:0
阅读:186
评论:5
如何生成一个伪随机数(最好使用Lua),其中生成器更有可能给出较小的数字?
在我的情况下,我想在游戏中给出一个随机分数,在这个游戏中,获取较低的分数很常见,但较高的分数很少出现。 我见过使用表的带权随机数生成器,但它不符合我的计划。我只想指定最小值(0)、最大值(变量)并确保大多数数字保持较低。
我确信这可以通过简单的数学操作实现,但我不记得是哪一个。就像过滤math.random的常规输出一样,不需要真正的随机发生器。
原文链接 https://stackoverflow.com/questions/4420502
点赞
stackoverflow用户513763
我只是转换标准随机函数的值,像这样:
r1=math.random(0,255)
r2=math.exp(math.random(0,255))
你需要考虑你的边界,但你会得到许多低值和少数高值。
2010-12-12 09:25:16
stackoverflow用户107090
尝试使用 math.floor(minscore+(maxscore-minscore)*math.random()^2)
。调整幂次数以适应所需的分布。
2010-12-12 10:50:13
stackoverflow用户312391
我发现Ihf的回答很有用,所以我为其创建了一个C#方法:
private int GetRandomNumber(int max, int min, double probabilityPower = 2)
{
var randomizer = new Random();
var randomDouble = randomizer.NextDouble();
var result = Math.Floor(min + (max + 1 - min) * (Math.Pow(randomDouble, probabilityPower)));
return (int) result;
}
如果probabilityPower
大于1,低值将比高值更常见。
如果在0到1之间,高值将比低值更常见。
如果是1,则结果将是一般随机的。
例如(所有的迭代都是一百万次,最小值为1,最大值为20):
probabilityPower = 1.5
1:135534(13.5534%)
2:76829(7.6829%)
3:68999(6.8999%)
4:60909(6.0909%)
5:54595(5.4595%)
6:53555(5.3555%)
7:48529(4.8529%)
8:44688(4.4688%)
9:43969(4.3969%)
10:44314(4.4314%)
11:40123(4.0123%)
12:39920(3.992%)
13:40466(4.0466%)
14:35821(3.5821%)
15:37862(3.7862%)
16:35222(3.5222%)
17:35902(3.5902%)
18:35202(3.5202%)
19:33961(3.3961%)
20:33600(3.36%)
probabilityPower = 4
1:471570(47.157%)
2:90114(9.0114%)
3:60333(6.0333%)
4:46574(4.6574%)
5:38905(3.8905%)
6:32379(3.2379%)
7:28309(2.8309%)
8:27906(2.7906%)
9:22389(2.2389%)
10:21524(2.1524%)
11:19444(1.9444%)
12:19688(1.9688%)
13:18398(1.8398%)
14:16870(1.687%)
15:15517(1.5517%)
16:15871(1.5871%)
17:14550(1.455%)
18:14635(1.4635%)
19:13399(1.3399%)
20:11625(1.1625%)
probabilityPower = 1
1:51534(5.1534%)
2:49239(4.9239%)
3:50955(5.0955%)
4:47992(4.7992%)
5:48971(4.8971%)
6:50456(5.0456%)
7:49282(4.9282%)
8:51344(5.1344%)
9:50841(5.0841%)
10:48548(4.8548%)
11:49294(4.9294%)
12:51795(5.1795%)
13:50583(5.0583%)
14:51020(5.102%)
15:51060(5.106%)
16:48632(4.8632%)
17:48568(4.8568%)
18:50039(5.0039%)
19:49863(4.9863%)
20:49984(4.9984%)
probabilityPower = 0.5
1:3899(0.3899%)
2:5818(0.5818%)
3:12808(1.2808%)
4:17880(1.788%)
5:23109(2.3109%)
6:26469(2.6469%)
7:33435(3.3435%)
8:35243(3.5243%)
9:42276(4.2276%)
10:47235(4.7235%)
11:52907(5.2907%)
12:58107(5.8107%)
13:63719(6.3719%)
14:66266(6.6266%)
15:72708(7.2708%)
16:79257(7.9257%)
17:81830(8.183%)
18:87243(8.7243%)
19:90958(9.0958%)
20:98833(9.8833%)
probabilityPower = 0.4
1:917(0.0917%)
2:3917(0.3917%)
3:3726(0.3726%)
4:10679(1.0679%)
5:13092(1.3092%)
6:17306(1.7306%)
7:22838(2.2838%)
8:29221(2.9221%)
9:35832(3.5832%)
10:38422(3.8422%)
11:47800(4.78%)
12:53431(5.3431%)
13:63791(6.3791%)
14:69460(6.946%)
15:75313(7.5313%)
16:86536(8.6536%)
17:95082(9.5082%)
18:103440(10.344%)
19:110203(11.0203%)
20:118994(11.8994%)
2011-08-31 19:56:16
stackoverflow用户12968803
function weighted_random (weights)
local summ = 0
for i, weight in pairs (weights) do
summ = summ + weight
end
local value = math.random (summ)
summ = 0
for i, weight in pairs (weights) do
summ = summ + weight
if value <= summ then
return i, weight
end
end
end
如何调用:
local elements = {"a", "b", "c", "d"} -- 元素
local weights = {40, 24, 22, 14} -- 元素权值
local n = weighted_random (weights) -- 返回1、2、3或4
local element = elements[n] -- 返回 "a"、"b"、"c" 或 "d"
-- 权值分别为:40/100, 24/100, 22/100, 14/100
2021-06-05 15:38:02
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
这可能不是你想要的,因为它不是一个平滑的偏斜正态分布曲线,但为什么不创建两个步骤呢?定义一个获得较低范围分数的概率,如果匹配,则您的范围是较低的范围。否则,您的范围从低范围顶部到高范围末端。
净效果是你通常得到低分,但有时你会得到高分。我打赌它看起来相当不错,而且非常简单。
你觉得呢?