栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为线性同余生成器选择A,C和M

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为线性同余生成器选择A,C和M

从维基百科:

如果 c 不为零,则在且仅在以下情况下,LCG将对所有种子值具有完整的周期:

  1. cm 是相对质数,
  2. a -1可被 m的 所有素因子整除,
  3. a -1是4的倍数,如果 m 是4的倍数。

你说你想要一个时期的48 5 -1,所以你必须选择 ≥48 5 -1。让我们尝试选择 m = 48 5
-1,看看会把我们带到哪里。如果希望周期为 m, 那么来自Wikipedia文章的条件将禁止您选择 c = 0 。 __

请注意,11、47、541和911是48 5 -1 的素数,因为它们都是素数,所以11 * 47 * 541 * 911 = 48 5 -1。

让我们经历以下每个条件:

  1. 为了使 cm 相对质数, cm 必须没有共同的质因数。因此,选择11、47、541和911 以外的 任何质数,然后将它们相乘以选择 c
  2. 你需要选择 一个 这样 一个 -1是所有的质因数整除 ,即 = X * 11 * 47 * 541 * 911 + 1对于任何 X 你选择的。
  3. 您的 m 不是4的倍数,因此您可以忽略第三个条件。

综上所述:

  • m = 48 5 -1,
  • c =除11、47、541和911以外的任何质数乘积(同样, c 必须小于 m ),
  • 对于您选择的任何非负 x ,a = x * 11 * 47 * 541 * 911 + 1 (而且 a 必须小于 m )。 __

这是一个较小的测试用例(在Python中),使用48 2 -1 的周期(素因数为7和47):

def lcg(state):    x = 1    a = x*7*47 + 1    c = 100    m = 48**2 - 1    return (a * state + c) % mexpected_period = 48**2 - 1seeds = [5]for i in range(expected_period):    seeds.append(lcg(seeds[-1]))print(len(set(seeds)) == expected_period)

它按需输出

True
。(如果您在阅读Python时遇到任何麻烦,请告诉我,我可以将其翻译为Javascript。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374692.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号