- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要做一个线性同余生成器,它将成功通过选定的统计测试。
我的问题是:如何正确选择生成器的数字以及我应该选择哪些统计检验?
我想过:
均匀性的卡方频率检验
每种生成方法收集 10,000 个数字
将[0.1) 分成10等分
Kolmogorov-Smirnov 均匀性检验
代码示例如下:
def seedLCG(initVal):
global rand
rand = initVal
def lcg():
a = 1664525
c = 1013904223
m = 2**32
global rand
rand = (a*rand + c) % m
return rand
seedLCG(1)
for i in range(1000):
print (lcg())
在选择种子时,我考虑的是纳秒级,但我不知道如何实现它,它是否有意义?这个想法是为了表明所选择的种子是随机选择的,而不是从上限中选择的。
最佳答案
关于如何正确地为生成器选择数字,在 Wiki 页面中有 Hull–Dobell 定理的描述,它告诉您如何选择 a
和 c
来获得全周期发生器。您从 Numerical Recipes 中获得了数字,据我所知,您将获得完整周期 [0...232) 生成器。或者您可以查看 this paper 的品质因数,有 (a,c) 对可用于任意大小的周期。
关于测试,看看@pjs 提供的论文。
在选择种子时,我考虑的是纳秒级,但我不知道如何实现它,它是否有意义?这个想法是为了表明所选种子是随机选择的,而不是从上限中选择的
。我认为这不是一个好主意,因为你不能保证你从 time/ceil/... 中挑选的种子不会重叠。 LCG 基本上是双射 [0...232)<->[0...232) 映射,并且相对容易重叠随机数流所以你的结果是相关的。
相反,我会建议使用 LCG 的另一个不错的属性 - 向前(和向后)对数跳跃。因此,为了模拟 N
核心,您可以只选择单个种子并在第一个代码上运行,相同的种子但跳过(N/2 32 )第二个核心,种子和跳过( N/232 * 2) 依此类推。
具有显式状态和跳过的 LCG 代码如下,Win10 x64,Python 3.7 Anaconda
import numpy as np
class LCG(object):
UZERO: np.uint32 = np.uint32(0)
UONE : np.uint32 = np.uint32(1)
def __init__(self, seed: np.uint32, a: np.uint32, c: np.uint32) -> None:
self._seed: np.uint32 = np.uint32(seed)
self._a : np.uint32 = np.uint32(a)
self._c : np.uint32 = np.uint32(c)
def next(self) -> np.uint32:
self._seed = self._a * self._seed + self._c
return self._seed
def seed(self) -> np.uint32:
return self._seed
def set_seed(self, seed: np.uint32) -> np.uint32:
self._seed = seed
def skip(self, ns: np.int32) -> None:
"""
Signed argument - skip forward as well as backward
The algorithm here to determine the parameters used to skip ahead is
described in the paper F. Brown, "Random Number Generation with Arbitrary Stride,"
Trans. Am. Nucl. Soc. (Nov. 1994). This algorithm is able to skip ahead in
O(log2(N)) operations instead of O(N). It computes parameters
A and C which can then be used to find x_N = A*x_0 + C mod 2^M.
"""
nskip: np.uint32 = np.uint32(ns)
a: np.uint32 = self._a
c: np.uint32 = self._c
a_next: np.uint32 = LCG.UONE
c_next: np.uint32 = LCG.UZERO
while nskip > LCG.UZERO:
if (nskip & LCG.UONE) != LCG.UZERO:
a_next = a_next * a
c_next = c_next * a + c
c = (a + LCG.UONE) * c
a = a * a
nskip = nskip >> LCG.UONE
self._seed = a_next * self._seed + c_next
#%%
np.seterr(over='ignore')
a = np.uint32(1664525)
c = np.uint32(1013904223)
seed = np.uint32(1)
rng = LCG(seed, a, c)
print(rng.next())
print(rng.next())
print(rng.next())
rng.skip(-3) # back by 3
print(rng.next())
print(rng.next())
print(rng.next())
rng.skip(-3) # back by 3
rng.skip(2) # forward by 2
print(rng.next())
更新
生成 10k 个数字
np.seterr(over='ignore')
a = np.uint32(1664525)
c = np.uint32(1013904223)
seed = np.uint32(1)
rng = LCG(seed, a, c)
q = [rng.next() for _ in range(0, 10000)]
关于python - 线性同余生成器——如何选择种子和统计检验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56985271/
这是我第一次提问,对于任何格式问题或任何让我难以回答的问题,我深表歉意。请让我知道我需要添加什么才能回答问题。 我正在尝试比较 2 个不相等的组大小(一个 ~ 97,另一个 ~ 714)之间的差异。差
这个问题在这里已经有了答案: dplyr summarize across ttest (1 个回答) 关闭 5 个月前。 我有这样的数据框 X1 X2 X3 X4 X5 class 1 1
我正在尝试对数据框中的两个数据子集运行 wilcox.test()。它们的长度不相等(48 对 260)。我想看看活橡树和水橡树的 dbh(胸高直径)是否存在差异。 Pine_stand 并收到该错
我有一个带有两个级别的因子列和许多数字列的数据框。我想按因子列拆分数据帧并对列对进行 t 检验。 使用示例数据集 Puromycin 我希望结果看起来像这样: Variable Treated
我尝试对数据框的所有列(一次两列)进行 t 检验,并仅提取 p 值。这是我想出的: for (i in c(5:525) ) { t_test_p.value =sapply( Data[5:525]
我有一个有 11 列数据的 Pandas 。我想通过测试将每一列与其他每一列进行比较(见下文)。如何创建一个循环来自动比较所有列,而无需为每个列对组合手动编写代码? from scipy.stats
我有一些数据,如下所示: # Groups: date [4] date data 1 2021-01-31 2 20
这就是我的数据的样子: > dput(data) structure(list(Name = c("Mark", "Tere", "Marcus", "Heidi", "Georg", "Tieme"
我有一个有 11 列数据的 Pandas 。我想通过测试将每一列与其他每一列进行比较(见下文)。如何创建一个循环来自动比较所有列,而无需为每个列对组合手动编写代码? from scipy.stats
我有一些数据,如下所示: # Groups: date [4] date data 1 2021-01-31 2 20
所以我有一些股票价格数据,我想测试价格是否遵循对数正态分布。我的代码如下: import scipy.stats as stats print(stats.kstest(df['DJIA'], "lo
我想对我的固定效应回归系数进行简单的联合 Wald 检验,但我想将限制设置为非零值。更具体地说,我想测试:H0: ai=0 and b=1 for every i或者基本上,是否从固定效应模型 (ai
我正在尝试进行双样本 t 检验,以检查两个数据集之间的均值是否存在显着差异。 我有两个数据集,每个数据集有 5 个试验,每个试验有 3 个特征。每个 Trial 都有不同的唯一标签,但 3 个特征(X
考虑以下虚拟数据: x <- rnorm(15,mean = 3,sd = 1) y <- rnorm(15,mean = 3,sd = 1) xy <- c(x,y) factor <- c(rep
我是一名计算机科学专业的学生,我正在自学算法类(class)。 在类(class)中我看到了这个问题: Show an efficient randomized algorithm to fact
我想使用拟合我的数据的 f 检验来比较两个模型。对于每个模型,我都执行了蒙特卡洛模拟,为每个模型参数和均方根拟合误差提供了统计估计。我想在 R 中使用 f-test 来确定哪个模型更可取。 最佳答案
我很难让 ks.test 使用卡方分布式数据: > chi10 ks.test(chi10, dchisq, df=10) One-sample Kolmogorov-Smirnov tes
我试图在 R 中复制 SPSS 的线性判别分析输出,但我很难找到执行 m-box 测试的方法。 我唯一找到的是一些发布在论坛上的代码,用于手动实现该过程,但我想知道语言本身是否已经包含用于此目的的任何
我有以下数据框: structure(list(test1 = c(0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1), test2 = c(0, 0, 1, 1, 0,
标准 stats::kruskal.test 模块允许计算数据集上的 kruskal-wallis 测试: >>> data(diamonds) >>> kruskal.test(price~cara
我是一名优秀的程序员,十分优秀!