请问下,比较简单的实现 0.5 到 2 之间的随机数的方法

2020-11-13 14:54:37 +08:00
 ukipoi

要求就是 扩大一倍或者缩小一倍,两边的概率相同。

这个可以用 Math.radom(),仅以数学的方式,一行就完成吗?

我好像只能先随机出是扩大还是缩小,然后在分别写扩大 /缩小的倍率。

大大们可以给个其他的思路么?

7910 次点击
所在节点    程序员
103 条回复
ukipoi
2020-11-13 16:44:32 +08:00
@hitmanx
谢谢解答
wlsnx
2020-11-13 16:54:52 +08:00
rand = random()
if rand >= 0.5:
return n * (rand * 2)
else :
return n * (rand + 0.5)
是不是想要这个效果?
ukipoi
2020-11-13 16:57:44 +08:00
@wlsnx
稍微有点不一样,else 后面是 return n*(rand*0.5+0.5)
不过大致上这样实现的,我自己就是这样写的。
我想问的其实是像 34 36 楼这样的解法
reus
2020-11-13 17:00:16 +08:00
I =random()
If i < 0.5 return i + 0.5
Else return i * 2
就是个分段函数啊,当然不可能一行公式表达出来
ukipoi
2020-11-13 17:02:15 +08:00
@ukipoi
主要是思路明显就不一样
我要的结果不一定是他们的结果
我就想要一种新的思路
“要扩大或者缩小 N 倍 ,其中 1<N<=2,那在数学中的表述就是乘以一个 [0.5-2]的数值把”
我是这么理解的,既然[0.5-1)表示缩小,(1-2]表示扩大。他们在逻辑中没有问题,但是比较反常理。
我就认为数学中一定有一个合理的解释,但是仅仅以无穷的数来解释我感觉很单调。
那一定有一个让人一眼看到就很合理的解释
ukipoi
2020-11-13 17:04:34 +08:00
@reus
我想问的其实不是说 把这个分段函数以一行公式表达出来。
而是一个新的思路,向 45 楼我说的那样。
感觉是我的标题误导了。我的问题其实是在第一行。
lllllliu
2020-11-13 17:14:10 +08:00
..大数随机然后归一化哦。归一化之后哪个范围都是符合分布规律的呀。
比如用高斯分布出的归一化随机数在转换扩大到哪个范围都是符合高斯分布到呀。
lllllliu
2020-11-13 17:15:54 +08:00
假设高斯分布得到到随机数是 0.5,那就是 min + 0.5 x (max-min) 比如 1-2 那就是 1.5 哦
ukipoi
2020-11-13 17:18:00 +08:00
@lllllliu
因为计算机里不存在无穷大,所以我觉得不能直接的认为[0.5,1)和(1,2]里包含的数是相等的
那就不能认为 random 出来的结果,[0.5,1)和(1,2]的概率是相等的
lllllliu
2020-11-13 17:18:10 +08:00
最简单的归一化 x = (x - min) / (max - min), 前端随机算法可以看你选择哦。输出的都是 0 ~ 1 直接的数,按照这个 min + 0.5 x (max-min) 怎么扩大都行。
lllllliu
2020-11-13 17:19:01 +08:00
@ukipoi 你的问题就是先选择一个符合你的随机数算法,进行归一化输出之后怎么扩大都是符合之前的随机数算法的
ukipoi
2020-11-13 17:19:54 +08:00
@ukipoi
或许也可能计算机有 [0.5,1)和(1,2]的概率是相等 办法我不知道?
lllllliu
2020-11-13 17:20:14 +08:00
@ukipoi 你自己也知道计算机是有精度的,选择你觉得符合你想要的动态范围的数据类型去表示就可以了。
oldw4ng
2020-11-13 17:20:21 +08:00
随机一个 1-2 的数然后再随机一个决定乘或除?
lllllliu
2020-11-13 17:21:25 +08:00
@ukipoi 相同的 bit 相同的算法出来的概率是相同的。不同的动态范围 那就存在压缩和扩展呢,就会出现你说的,永远不可能出现一些数。
ukipoi
2020-11-13 17:22:58 +08:00
@lllllliu
对的对的,因为我的前提就是概率相等,应当从[0-0.5) 和 (0.5-1]推导到 [0.5-1]和[1-2]
我这个算是弄反了?
lllllliu
2020-11-13 17:23:07 +08:00
@ukipoi 啦啦啦,所以有不同的归一化和标准化算法,题主可以研究下,俺们在研究很多东西的时候都会转换到 0 ~ 1 之间来解决的。
xuanbg
2020-11-13 17:25:14 +08:00
小数先定义精度吧,不定义精度的话,说啥都没意义。
lllllliu
2020-11-13 17:32:33 +08:00
总的来说感觉有点牛角尖了。
假设精确到 1 位,也就是 0 ~ 1 之间有 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 这几个数。(动态范围)
然后假设一个随机数算法输出 0.5 的几率是 50%。。
那么扩大到 1-2 之间的话按照这个随机数算法出来 1.5 的几率也是 50%;
所以。。。简单归一化(虽然多余) x = (x - min) / (max - min) = ( 0.5-0 ) / ( 1-0 ) = 0.5 (动态位置);
然后。。1 + 0.5 x (2-1) = 0.5 (扩大后的位置);
所以重心点应该在 随机数生成规则以及你需要的动态范围(精度,采样)这个在计算机里是有上限的。
但是再怎么上限也不会影响随机算法的结果。。
当您觉得精度不够可以升采样,当你觉得精度(动态过了)可以降采样。。
啊啊啊随便扯的。。下班。
0o0o0o0
2020-11-13 17:38:21 +08:00
|random(0,2)-0.5|+0.5

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/724860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX