【问题标题】:Erlang: Is there a more elegant way to get a random integer in a specific range, regarding the distributionErlang:关于分布,有没有更优雅的方法来获取特定范围内的随机整数
【发布时间】:2021-07-26 19:51:16
【问题描述】:

我的方法如下:

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 之间的范围。

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

【问题讨论】:

  • 您关于一致性的逻辑不正确。添加Num1 会将数轴上的所有值移动该数量,但不会影响范围或均匀性。将数字 1、2 和 3 加上 5 后得到数字 6、7 和 8。如果前一个都有 k,那么后者每个都有 k。
  • 谢谢你,这很清楚。你是对的,它只是改变了价值观。

标签: random erlang distribution


【解决方案1】:

由于rand:uniform(17) 返回一个介于 1 和 17 之间的数字,因此向它添加 3 将得到一个介于 4 和 20 之间的数字。试试这个吧:

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

如果Num1 为 3,Num2 为 20,则将变为 rand:uniform(18) + 2,给出 3 到 20 之间的随机数。

【讨论】:

  • 谢谢,这部分回答了我的问题。我的解决方案不正确!尽管如此,这种分布对于大量的人来说还是难以忍受的。您是否想到了一个均匀分布的解决方案,而在最低数字上没有更高的概率?
  • 文档说明返回值是均匀分布的,所以如果不是,可能值得提交一个错误报告。您使用的是 Erlang/OTP 22 还是更新版本?该版本中的默认算法was changed
  • 我的意思是,rand:uniform 是均匀分布的。我希望如此......我认为在添加和减去您的解决方案中的值之后,可以改变分布。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 2011-04-05
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多