- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道 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/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!