我对臭名昭著的Randu随机数生成器的三字猴子测试实现是否正确?
关于Randu三字猴子测试代码的分析
嘿,咱们一步步拆解你给出的代码片段,看看它离正确实现三字猴子测试还差哪些关键部分:
1. 核心缺失:Randu随机数生成逻辑
你要测试的是臭名昭著的Randu生成器,但当前代码里完全没有实现它的生成逻辑!Randu是个线性同余生成器(LCG),它的递推公式是:X_{n+1} = (65539 * X_n) mod 2^31
你现在用的numpy.random.randint是numpy自带的随机数生成器,和Randu完全不是一回事——这等于你测试的是错的对象,根本达不到目标。
2. 三字组合的统计逻辑未实现
虽然你提到了17576种三字组合(对应26个字母的3次幂),但代码里:
- 没有把Randu生成的数值映射到对应字符的逻辑(比如把随机数归一化后映射到a-z)
- 没有统计每种三元组实际出现的频次的代码
- 导入的
itertools.product也没派上用场(它可以用来枚举所有可能的三元组,方便后续频次对比)
3. 卡方检验的调用不完整
scipy.stats.chisquare需要两个关键参数:实际观测到的频次数组和期望频次数组。你现在只定义了单个的expectation = multiple,但没有把实际统计出的各三元组频次传进去,也没有构造出和观测数组长度一致的期望数组(每个元素都是multiple),这样根本没法执行卡方检验。
简单修正方向示例
这里给你补个核心逻辑的示例片段,你可以参考完善:
from itertools import product from scipy.stats import chisquare # 实现Randu生成器 def randu_generator(seed=1, count=1): rand_nums = [] x = seed for _ in range(count): x = (65539 * x) % (2**31) rand_nums.append(x) return rand_nums # 参数设置 multiple = 10 total_combinations = 26**3 # 17576 number_of_random_numbers = total_combinations * multiple # 生成Randu序列并映射到a-z字符 randu_nums = randu_generator(count=number_of_random_numbers) chars = [chr(ord('a') + (num % 26)) for num in randu_nums] # 统计所有三字组合的频次 triple_counts = {''.join(triple): 0 for triple in product('abcdefghijklmnopqrstuvwxyz', repeat=3)} for i in range(len(chars)-2): triple = ''.join(chars[i:i+3]) triple_counts[triple] += 1 # 准备观测和期望频次数组 observed = list(triple_counts.values()) expected = [multiple] * total_combinations # 执行卡方检验 chi2, p_value = chisquare(observed, expected) print(f"卡方值: {chi2}, p值: {p_value}")
总的来说,你当前的代码只是搭了个非常基础的参数框架,核心的生成、统计、检验步骤都缺失,所以还不能正确执行三字猴子测试哦。
内容的提问来源于stack exchange,提问作者Mr. President
相关产品推荐
相关产品推荐

