gpt4 book ai didi

random - random() 似乎不会绘制范围极值

转载 作者:行者123 更新时间:2023-12-04 02:02:29 26 4
gpt4 key购买 nike

出于几个合理的原因,我必须使用 BSD 的 random() 来生成非常大量的随机数,并且由于它的周期很短(~2^69,如果我没记错的话),这些数字的质量会降低对于我的用例来说很快。我可以使用我可以访问的 rng 板,但它非常慢,所以我想我可以做这个技巧:从板上取一个数字,用它来播种 random(),使用 random() 来绘制数字并在出现时重新播种董事会说有一个新号码可用。该板每秒生成大约 100 个数字,所以我猜测 random() 几乎无法循环,并且生成速率很容易满足我每秒数百万个数字的要求。

无论如何,问题在于 random() 声称在 0 和 (2^31)-1 之间统一绘制数字,但我一直在绘制不可数的数字,而且我从未见过 0 或 a (2^31)-1 到目前为止。也许是 1 和 (2^31)-2,但我从未见过极端情况。现在,我知道随机数的问题在于您永远无法确定(参见 Dilbert,Debian),但这看起来非常奇怪。此外,我尝试使用 histc() 函数使用 Octave 分析生成的数据集,最低和最高的箱子包含中间箱子数量的一半到四分之三(它们依次被均匀填充,所以我猜在一些感觉分布是“均匀的”)。

有人能解释一下吗?

编辑一些代码

电路板输出这个包含三个组件的结构,然后我将它们组合起来以产生种子。我没有关于这 block 板的规范,它是几年前由以前的学生拼凑起来的一个古老的硬件,几乎没有文档,我使用的这个公式是文档中建议的公式之一。 STEP 参数告诉我可以使用一个种子绘制多少个数字,以便我可以优化性能并同时降低 CPU 使用率。

float n = fabsf(fmod(sqrt(a.s1*a.s1 + a.s2*a.s2 + a.s3*a.s3), 1.0));
unsigned int seed = n * UINT32_MAX;
srandom(seed);

for(int i = 0; i < STEP; i++) {
long r = random();
n = (float)r / (UINT32_MAX >> 1);
[_numbers addObject:[NSNumber numberWithFloat:n]];
}

最佳答案

你确定吗

void main() {
while (random() != 0L);
}

无限期挂起?在我的 Linux 机器上(Gnu C 库使用与 BSD 相同的 linear feedback shift register,尽管使用不同的播种程序)它没有。

根据 this reference该算法产生“运行”的连续零或长度最大为 n-1 的位置,其中 n 是移位寄存器的大小。当它的大小为 31 个整数(默认情况)时,我们甚至可以确定,最终 random() 将返回 0 高达 30(但永远不会返回 31) 连续次!当然,我们可能要等上几个世纪才能看到它的发生……

关于random - random() 似乎不会绘制范围极值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10776747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com