Random Erlang:关于分布,有没有更优雅的方法来获取特定范围内的随机整数

Random Erlang:关于分布,有没有更优雅的方法来获取特定范围内的随机整数,random,erlang,distribution,Random,Erlang,Distribution,我的做法如下: Num 1和Num 2是给定的数字,表示范围的开始和结束, 生成的随机整数可以是num 1或num 2 Num1 + rand:uniform(Num2-Num1). 例如: 数值1=3 数值2=20 rand:uniform返回一个介于1和17之间的值。然后我再次添加Num 1, 所以随机值在给定的范围内 我看到这个实现的问题是随机数的分布, 因为范围中的最小数字具有更高的概率,这取决于0和num 1之间的距离以及num 1和num 2之间的范围 我希望有一个更简单、更优雅的

我的做法如下:

Num 1和Num 2是给定的数字,表示范围的开始和结束, 生成的随机整数可以是num 1或num 2

Num1 + rand:uniform(Num2-Num1).
例如:

数值1=3 数值2=20

rand:uniform返回一个介于1和17之间的值。然后我再次添加Num 1, 所以随机值在给定的范围内

我看到这个实现的问题是随机数的分布, 因为范围中的最小数字具有更高的概率,这取决于0和num 1之间的距离以及num 1和num 2之间的范围

我希望有一个更简单、更优雅的解决方案,可以均匀地分布整数…

因为rand:uniform17返回一个介于1和17之间(包括1和17)的数字,加上3将得到一个介于4和20之间的数字。请尝试以下方法:

rand:uniform(Num2 - Num1 + 1) + Num1 - 1
如果Num1是3,Num2是20,那么它将变成rand:uniform18+2,给出一个3到20之间的随机数。

因为rand:uniform17返回一个1到17之间的数字,所以将3加上它将得到一个4到20之间的数字。请尝试以下方法:

rand:uniform(Num2 - Num1 + 1) + Num1 - 1

如果Num1是3,Num2是20,那么这将成为rand:uniform18+2,给出一个3到20之间的随机数。

谢谢,这部分回答了我的问题。我的解决方案不正确!尽管如此,这种分布对于很多人来说是无法忍受的。你有没有一个解决方案是均匀分布的,而不是在最低的数字上有更高的概率?文档说明返回值是均匀分布的,所以如果不是,可能值得提交一份bug报告。您使用的是Erlang/OTP 22还是更高版本?那个版本的默认算法。我是说,rand:uniform是均匀分布的。我希望如此。。。我认为在加上和减去解中的值后,可以改变分布。谢谢,这部分回答了我的问题。我的解决方案不正确!尽管如此,这种分布对于很多人来说是无法忍受的。你有没有一个解决方案是均匀分布的,而不是在最低的数字上有更高的概率?文档说明返回值是均匀分布的,所以如果不是,可能值得提交一份bug报告。您使用的是Erlang/OTP 22还是更高版本?那个版本的默认算法。我是说,rand:uniform是均匀分布的。我希望如此。。。我认为在加上和减去解中的值后,可以改变分布。你关于均匀性的逻辑是错误的。添加Num1将沿数字线的所有值移动该量,但不影响范围或均匀性。把数字1、2和3加上5,就得到了数字6、7和8。如果你有前一个的k,你也会有后一个的k。谢谢你,这就很清楚了。你是对的,这只是改变了价值观。你关于一致性的逻辑是错误的。添加Num1将沿数字线的所有值移动该量,但不影响范围或均匀性。把数字1、2和3加上5,就得到了数字6、7和8。如果你有前一个的k,你也会有后一个的k。谢谢你,这就很清楚了。你是对的,这只是改变了价值观。