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

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

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

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

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

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

7943 次点击
所在节点    程序员
103 条回复
Lemeng
2020-11-14 00:14:45 +08:00
都*10,就是 5-20 之间
luwies
2020-11-14 00:22:45 +08:00
1.5 * Math.radom() + 0.5
Takuron
2020-11-14 08:36:36 +08:00
先不说怎么写,让你“缩小一倍”的老师一定语文有问题,记得清清楚楚这是高考病句类型的一种。
chenyu8674
2020-11-14 09:35:01 +08:00
没有“缩小 N 倍”这种说法,应为为“变为 N 倍或变为 N 分之一”
Anarchy
2020-11-14 10:31:48 +08:00
所以楼主是希望生成一个 0.5-1 和 1-2 概率相同的么 79 楼的可以
crackhopper
2020-11-14 10:46:31 +08:00
一行代码? Math.pow(Math.random()+1, Math.pow(-1, (Math.random()>0.5)))
crackhopper
2020-11-14 10:48:21 +08:00
或者 (Math.random()>0.5) and Math.random()+1 or 1/(Math.random()+1)
crackhopper
2020-11-14 10:48:37 +08:00
或者 (Math.random()>0.5) and (Math.random()+1) or 1/(Math.random()+1)
Delbert
2020-11-14 12:57:38 +08:00
@ukipoi 0.5-1 和 1-2 这两个区间 数都是无穷多,哪怕 0.5-0.5000001 数也是无穷多,不存在数字谁多谁少的问题。
你的问题在与区间长度而不是数字数量。
qaqLjj
2020-11-14 13:27:54 +08:00
```javascript
Math.pow(2,Math.random()*2 - 1)
```
exiledkingcc
2020-11-14 15:43:07 +08:00
你想要的是一个在 0.5-1 上是均匀分布,在 1-2 上也是均匀分布,但是落到 0.5-1 与 1-2 上的概率相等?
这样的话,很多答案写的 2^(random() * 2 - 1)是不满足的。因为在这两个区间不是均匀分布的。
其实很简单:abs(random() * 2 - 0.5) + 0.5
PopRain
2020-11-14 17:26:41 +08:00
楼主数学水平不知道怎么样,语文水平我觉得有点堪忧。。。。看标题很简单,看说明、补充说明越看越看不懂到底要干什么
dejavuwind
2020-11-16 10:13:38 +08:00
同 90L,缩小一倍为 2^-1,放大 1 倍为 2^1,其实就是放大的倍数均匀分布(-1,1 )
ukipoi
2020-11-16 11:02:01 +08:00
@exiledkingcc
请教下,为什么是不满足的?
2^(random() * 2 - 1) 这个函数图像时连续的,那应该是所有的 X 都有唯一对应的 Y,并且 所有确定的 X 都是 1/K 的概率(假设 K 是-1 到 1 的所有数的总量)。那所有的 Y 也是 1/K 的概率,[0.5,1)和(1,2]的概率也是一样,那范围内的所有数都在了
abs(random() * 2 - 0.5) + 0.5 的话,有些 Y 对应了两个 X,这个意思是一样的么?
ukipoi
2020-11-16 11:12:29 +08:00
@CRVV
请教下
2^(random() * 2 - 1) 得到 0.5-0.75 的概率是比 0.75 到 1 的概率大。
但是每一个 X 都只对应一个 Y,并且这个函数是连续的。
那这个对应关系到底对不对呢?
因为每一个 Y 出现的概率都是 1/K,这个是肯定的
exiledkingcc
2020-11-16 11:18:55 +08:00
@ukipoi
2^(random() * 2 - 1)是指数分布啊,怎么可能和均匀分布是一样的???
它取值在 0.5-1 与 1-2 上是等概率的。但是显然在 1-1.5 与 1.5-2 上不是的。其它等区间的概率也不是一样的。

关键在于你想要的是一个什么样的概率分布。
ukipoi
2020-11-16 11:25:56 +08:00
@exiledkingcc
但是每一个确定的 Y 出现的概率是一样的吧?
CRVV
2020-11-16 11:41:14 +08:00
@ukipoi

首先你需要说清楚你在讨论实数还是在讨论 64 位浮点数

如果是实数,那么 “K 是-1 到 1 的所有数的总量” 这句话不成立,后面就不用讨论了。
不能设 K 是无限,然后把 K 当一个有限的数来做后续的讨论。

如果是 64 位浮点数,那么 “每一个 Y 出现的概率都是 1/K” 是错的。
比如
2 ^ 0.1000000000000002 和 2 ^ 0.10000000000000014 的结果都是 1.0717734625362934
no1xsyzy
2020-11-16 11:53:17 +08:00
你不规定随机分布函数?那不是就空气等于空气吗?
@cmdOptionKana #71 无论实数还是有理数,0-1 和 0-2 是可以无损相互转换的……
数学没有随机数,只有随机事件、概率分布、测度。
CRVV
2020-11-16 12:04:45 +08:00
这里的关键是楼主没想清楚自己要的是什么

给定的要求只有一个,>1 和 <1 的概率相等。
这样不能确定唯一的答案,所以下面给出了很多不同的解答。
给的解释又超出了楼主能解理的数学,所以估计现在更不懂了。

除了上面那个给定的要求,显然还存在一个要求是概率在某种程度上是均匀的,但均匀又存在不同的均匀。

比如把所有结果 round 到一个最接近的数,然后
0.5 0.6 0.7 0.8 0.9 1.0 1.2 1.4 1.6 1.8 2.0 的概率相同
1/2.0 1/1.8 1/1.6 1/1.4 1/1.2 1/1.0 1.2/1 1.4/1 1.6/1 1.8/1 2.0/1 的概率相同
这两个也不一样,都可以被认为是均匀的

上面说的,其实不仅 “每一个 Y 出现的概率都是 1/K” 对浮点数是错的,“所有确定的 X 都是 1/K 的概率” 也是错的。
因为浮点数本身是不均匀的,但那个随机数是均匀的。

建议楼主放弃这个问题吧,需要补的课挺多的。

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

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

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

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

© 2021 V2EX