gpt4 book ai didi

c - rand() 在 C 语言中如何工作?

转载 作者:行者123 更新时间:2023-11-30 21:15:21 24 4
gpt4 key购买 nike

我知道 rand() 生成一个随机数。我找到了this example关于它:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, n;
time_t t;

n = 5;

/* Intializes random number generator */
srand((unsigned) time(&t));

/* Print 5 random numbers from 0 to 49 */
for( i = 0 ; i < n ; i++ )
{
printf("%d\n", rand() % 50);
}

return(0);
}

我知道这个问题可能听起来有点傻,但是有人可以解释一下上面的代码是如何工作的吗?

最佳答案

您应该知道,获取有关 C 标准库信息的最简单方法是使用 Linux/UNIX 系统上的手册页。

手册章节3您可以在其中找到有关标准库的手册页。获取 rand 的文档,输入man 3 rand在 shell 提示符下。

如果您手头没有手册页,我将直接引用此处的说明:

DESCRIPTION

The rand() function returns a pseudo-random integer in the range 0 to
RAND_MAX inclusive (i.e., the mathematical range [0, RAND_MAX]).

The srand() function sets its argument as the seed for a new sequence
of pseudo-random integers to be returned by rand(). These sequences
are repeatable by calling srand() with the same seed value.

If no seed value is provided, the rand() function is automatically
seeded with a value of 1.

The function rand() is not reentrant or thread-safe, since it uses hid‐
den state that is modified on each call. This might just be the seed
value to be used by the next call, or it might be something more elabo‐
rate. In order to get reproducible behavior in a threaded application,
this state must be made explicit; this can be done using the reentrant
function rand_r().

Like rand(), rand_r() returns a pseudo-random integer in the range
[0, RAND_MAX]. The seedp argument is a pointer to an unsigned int that
is used to store state between calls. If rand_r() is called with the
same initial value for the integer pointed to by seedp, and that value
is not modified between calls, then the same pseudo-random sequence
will result.

The value pointed to by the seedp argument of rand_r() provides only a
very small amount of state, so this function will be a weak pseudo-ran‐
dom generator. Try drand48_r(3) instead.

RETURN VALUE

The rand() and rand_r() functions return a value between 0 and RAND_MAX
(inclusive). The srand() function returns no value.

如果你想知道代码本身是如何工作的,我可以为你分解:

#include <stdio.h>

包括标准 I/O 库。 (在本例中需要获取 printf() 的定义。)

#include <stdlib.h>

包括 C 标准库(针对当前平台)。这将需要获得 rand() 的定义, srand() ,和time() .

int main()

定义函数main() ,稍后将找到它作为已编译的可执行文件的入口点。

{

定义 main() 的范围.

   int i, n;

在堆栈上分配两个内存空间int变量,i ,和n .

   time_t t;

在堆栈上为 time_t 分配内存空间结构,稍后将在当前时间使用。

   n = 5;

初始化int n到值 5。

   /* Intializes random number generator */
srand((unsigned) time(&t));

第一次调用time()参数是 time_t 的内存地址较早在堆栈上分配。这将填充 time_t与当前时间。 (实际上只是表示为整数 - 自“纪元”以来的秒数 - 请参阅 man 2 time )

接下来,调用srand()具有该值(将其转换为 unsigned int 后,这可能会避免编译器警告,但如果您知道 sizeof(time_t) >= sizeof(int) ,则可能是安全的。)。调用srand()这里将播种 PRNG(伪随机数生成器)。

   /* Print 5 random numbers from 0 to 49 */
for( i = 0 ; i < n ; i++ )
{

for声明(用我自己的话),你会看到 <initialization-instruction> ; <condition> ; <loop-instruction> 。 while <condition> 执行循环的内容是 true(在 C 语言中,这意味着非零,但这是一个单独的讨论)。

设置 int i之前定义为零。而i小于 n ,执行大括号 ( { ... } ) 内的操作,然后递增 i ( ++i ) 并再次检查情况。 ( n 之前被定义为 5,因此循环遍历值 [0, 1, 2, 3, 4] )

      printf("%d\n", rand() % 50);

printf()调用使用格式字符串来打印其输出。 %d意味着你想要printf打印出第一个参数,假设它是无符号十进制整数。如果您在 printf 中包含更多格式字符串调用时,您应该将多个相应的参数包含到 printf()功能。

\n ,当它出现在字符或字符串常量中时,是换行符。因此打印数字后,光标将移动到下一行的开头。

最后,rand() % 50意思是“调用 rand() ,将结果除以 50 ,然后取余数”。 (%运算符,这意味着您需要余数。)例如,如果 rand()返回 1000,你会得到 0打印到屏幕上,因为 1000 % 50 == 0 (即 1000 除以 50 等于 20,余数 0)。

因此最终结果将打印 0 到 49 之间的伪随机值。

   }

return(0);

这将导致main()完成执行并返回到其调用者(可能是在操作系统上加载二进制文件的任何代码)。它还很可能导致程序的退出状态为 0 .

}

关于c - rand() 在 C 语言中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33380282/

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