关于c中的rand()

关于c中的rand(),c,random,C,Random,q1) 这是rand()和srand()的实现: 对吗 由最流行的实现使用 标准要求 问题2) 那么,如果q1)是真的(或者以另一种方式),那么在这样的函数中有循环是真的吗,rand()可以被解释为在随机点给出的循环序列 // Hypotetically srand(a) if rand() = b then expr(a) = b if rand() = a then expr(b) = a // Then any call to rand would give successively

q1)

这是rand()和srand()的实现:

  • 对吗
  • 由最流行的实现使用
  • 标准要求
问题2)

那么,如果q1)是真的(或者以另一种方式),那么在这样的函数中有循环是真的吗,rand()可以被解释为在随机点给出的循环序列

// Hypotetically
srand(a)
if rand() = b then expr(a) = b
if rand() = a then expr(b) = a
// Then any call to rand would give successively [a, b, a, b, a, ...] infinitely
// This example is for two values but can work for a sequence of any length
我假设rand()函数在64位上的最大迭代次数为2^64次,32位上的最大迭代次数为2^32次之后是循环的。 例如,如果序列中的某个位置存在:

12891, 872821, 33, 872821, 33, 872821, ... Infinitely
我们可以将零件
33872821
和前面的零件隔离开来,并从第二个箭头指向第一个箭头。然后,兰德函数可以通过以下程序生成的图来描述:

for(int i = 0; i < RAND_MAX; i++) {
    srand(i);
    while(rand() != i);
    // ISolate the cycle for seed = i
}
for(int i=0;i
问题3)

如果q2)为真(或以另一种方式),我们如何确保该函数不会给出任何重复或非常少的“断开”序列,或者只是它未指定

第四季度)

我们能找出哪个种子在序列之前吗?

1)正确吗?是
必修的?没有具体要求。生成的数字的质量是一个“执行质量”问题

2) 除重复性外,本标准中没有其他要求

3) 执行质量

4) 实现质量

根据(和),
rand()
将生成一个周期至少为2^32的伪随机数序列

函数的作用是:计算0到{rand_MAX}范围内的伪随机整数序列,其周期至少为2^32

这意味着在生成2^32个数字之前,它不会重复相同的数字序列。至于你的第一个问题,它是确定的,因为每次给
rand()
的种子都会产生完全相同的序列

q1)这个rand()和srand()的实现是否正确

我会说不。
*代码当然不会将rand()的范围限制为[0…INT\u MAX]
return\uuu seed&INT\u MAX将解决这个问题。
*无保留标识符
\u seed
是编号C17dr 7.1.3 1。我希望
static unsigned\uu seed
限制范围。
*对于用户创建的
rand(),srand()
,我也希望有
rand\u MAX
定义

q1)最流行的实现是否使用了rand()和srand():的这种实现

怀疑。IAC,“最流行”的实现是主观的。每年制造数十亿个嵌入式处理器,它们的普及和较小的占地面积可能会扭曲“最流行”实现的想法。我认为,除了利用弱的
rand()
之外,假设这样的实现没有任何好处。我希望大多数实现将倾向于使用比种子更广泛的状态**

q1)该标准是否要求实现rand()和srand()

不,标准是相当开放的


**虽然seed值被限制为一个无符号的,比如32位,但是state变量可能要宽得多——可能有数百位。当然,这意味着所有状态都不能成为种子点

srand()
种子也可能被忽略。当我阅读规范时,没有要求使用种子的所有位

srand(),rand()
的质量可以是好的,也可以是差的——范围小到
[0…32767]
,也许周期也小到如此

问题4)我们能找出哪个种子出现在序列之前吗


我想到了野蛮的力量——尝试大量的种子。根据规范,相同的种子点将为该实现生成相同的
rand()
输出序列。除此之外,没有指定的方式。注意,所需的种子可能不存在,无法从种子中实现选择序列
rand()

还需要考虑
rand\u MAX
。因为问题标记为C,而不是Unix,答案应该使用C标准,而不是Unix标准。在这个答案中链接的C标准没有为
rand()
函数设置任何句点,2^32要求在一个“XSI”子句中。这将取决于只依赖种子的uu确定性和u快速数学表达式,不是吗?谁说
rand()
是否具有64位伪随机性?标准当然没有。有些系统只有15位,这就是为什么
rand()。
for(int i = 0; i < RAND_MAX; i++) {
    srand(i);
    while(rand() != i);
    // ISolate the cycle for seed = i
}