You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我对臭名昭著的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:46:14