【问题标题】:Programming an lcg in MatlabMatlab中的lcg编程
【发布时间】:2013-03-07 12:37:02
【问题描述】:

我正在尝试使用线性同余生成器在 Matlab 中解决以下问题。我的函数代码行如下所示。 m 基本上是您可以预期的值范围的最大值,因此取决于问题。初始种子x 首先由时钟确定,然后将每个随机数反馈到函数中以产生一个新的。这里给出了选择 lcg 值的规则http://en.wikipedia.org/wiki/Linear_congruential_generator。我需要的是ac 在指定期间的良好值。

我的 lcg 代码

random_number = mod((a*x + c),m);
  • Q1 需要 1 到 52 之间的随机数(扑克手的概率)
  • Q2 需要 1 到 366 之间的随机数(生日悖论)
  • Q3 需要一个介于 1 和 3 之间的随机数(Monty Hall 问题)
  • Q4 需要 1 到 1000 之间的数字

我知道这看起来很简单,但是用小范围实现它往往会产生一个周期较短的模式,即 4 位数字不断重复。

还可以使用不同的m 值并过滤掉我所需范围之外的任何值,但老实说,我认为这没有必要。 非常感谢

【问题讨论】:

  • LCG 似乎容易出现周期性,尤其是在 m 值较小的情况下。您可以使用更大的 m 值并适当地缩放输出。 (参考:stackoverflow.com/questions/6415424 - 见第二个答案 + cmets)

标签: matlab random


【解决方案1】:

我会以不同的方式处理这个问题:

  • 取一些已知值(维基百科有一个表格)
  • 如果你接受它们,你可以假设*它们分布​​均匀
  • 将结果缩放到您的范围,例如rnd()*52 / m + 1 并将其作为输出

    *请记住,“当你假设的时候,你把你和我搞得一团糟”;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多