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

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

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

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

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

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

7276 次点击
所在节点    程序员
103 条回复
Xs0ul
2020-11-13 15:34:04 +08:00
因为概率密度不一样,是个分段函数,感觉上肯定是要用到 if else 。宁可多写几行,不然以后很容易被自己坑
H15018327040
2020-11-13 15:35:43 +08:00
Math.floor((Math.random()*1.5)+0.5),先随机一个 0 到 1.5 的数,然后再加上 0.5
anzu
2020-11-13 15:35:58 +08:00
Math.random 范围是 [0, 1),对其乘除改变区间长度,加减相当于数轴平移
0.5~2 的区间长度 1.5,是原区间的 1.5 倍,所以 乘以 1.5
新区间距数轴原点 0.5,所以 + 0.5
因此结果是 Math.random() * 1.5 + 0.5
任何区间都可以以此求解
ukipoi
2020-11-13 15:44:49 +08:00
@anzu
但是原先 0-0.5 和 0.5-1 这两个区间的数是一样多的
乘以 1.5 后 应当是 0-0.75 和 0.75-1.5 这两个区间的数是一样多的
加上 0.5 后 应当是 0.5-1.25 和 1.25-2 这两个区间的数是一样多的
我的要求是 0.5-1 和 1-2 这两个区间 数一样多
nightwitch
2020-11-13 15:50:08 +08:00


C++的标准库的实现,从[0,1)生成[a,b)之间的分布
nightwitch
2020-11-13 15:52:22 +08:00
@ukipoi 你#24 写的需求和题干的需求完全不一样啊。
nightwitch
2020-11-13 15:55:09 +08:00
你#24 的需求应该写成分段的形势,两个生成器,1 个生成[0.5,1) 一个[1,2), 然后用抛硬币的方式决定选用哪个生成器。
ukipoi
2020-11-13 15:56:33 +08:00
@nightwitch
我应该是写了的 [要求就是 扩大一倍或者缩小一倍,两边的概率相同。] 可能表达的不太清楚
vgbhne
2020-11-13 16:00:05 +08:00
可以想成有两个面积相同的靶,用两次 ran 取其坐标看落在哪个靶上。
Jooooooooo
2020-11-13 16:03:36 +08:00
随机两次
hitmanx
2020-11-13 16:07:50 +08:00
r = rand() # 假设 rand()返回[0, 1]
return (r + 0.5) if (r < 0.5) else r * 2 #相当于 50%的概率位于[0, 0.5),要把它 scale 到[0.5, 1); 50%的概率位于[0.5, 1],要把它 scale 到[1, 2]
wlsnx
2020-11-13 16:08:39 +08:00
你是不是想实现“使一个数乘以[0,2)中的一个随机数”? n*(random()*2),(random()*2) < 1 就是缩小,>1 就是放大,倍率也是随机的。( python 里 random()返回[0,1)中的一个随机浮点数,其他语言自行修改。)
x4400177
2020-11-13 16:14:24 +08:00
@ukipoi 0.5-1 和 1-2 的概率本来就不一样
hitmanx
2020-11-13 16:15:19 +08:00
发完贴想起来,我这样写和你原帖是一样的,需要分情况讨论,原因是你这种表示方法(0.5 表示缩小一倍,2 表示放大一倍)不是对称也不是均匀分布的;另一个表示方法是负数表示缩小,正数表示放大,那么实际上就从[0.5,2]变成了[-2, 2],就对称了。

因此换个思路的话,你这个其实是指数对称,也就是 2^-1 表示缩小一倍,2^1 表示放大一倍,这样指数项就变成了对称且均与分布的了:

# 假设返回[-1, 1]
return exp(2, rand())
ifzzzh
2020-11-13 16:17:35 +08:00
生成-0.5~0.5,如果>0 就 x2,最后+1
lsylsy2
2020-11-13 16:20:16 +08:00
x=(-1,1)之间随机数
y=2^x ( 2 的 x 次方)
这个 y 的分布不是线性平均的,但是可能是 LZ 需要的
lsylsy2
2020-11-13 16:21:32 +08:00
Wincer
2020-11-13 16:21:50 +08:00
0-0.5,0.5-1,1-2,这几个区间的数的数量没办法比较大小,因为都是无穷多个数
ifzzzh
2020-11-13 16:24:33 +08:00
建议先画出想要的概率密度函数
ukipoi
2020-11-13 16:43:25 +08:00
@x4400177
问题是,我要扩大或者缩小 N 倍 ,其中 1<N<=2
那在数学中的表述就是乘以一个 [0.5-2]的数值把。
我认为扩大和缩小,应该是有一个概率是一样的。
所以[0.5-1 )和( 1-2]也应该是一样的

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

https://tanronggui.xyz/t/724860

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

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

© 2021 V2EX