这是一些c ++代码的摘录,我将在几天内详细解释:
std::vector<int> vct(8, 5);
std::generate(vct.begin(), vct.end(), &rand);
std::copy(vct.rbegin(), vct.rend(),
std::ostream_iterator<int>(std::cout, "\n"));
我想我理解它的一切,除了那个微小的神秘和兰德。究竟是做什么的?我的意思是它显然会产生某种伪随机数,但它们总是保持不变。 &amp; rand来自哪里?它是什么样的表达方式?它产生的价值来自哪里?我有点困惑......
另外,我在代码中找不到任何其他出现的“rand”这个词,也没有看到任何可能与随机数有关的代码。这让我很奇怪,因为我(非常有限)的c ++经验表明,只有很少的东西可以简单地工作,而不需要先申报或包括在内。
感谢帮忙!
答案 0 :(得分:13)
&
中的&rand
会返回rand()
函数的地址。您正在将函数指针传递给generate()
,因此generate()
可以调用rand()
来生成随机数。
答案 1 :(得分:5)
rand()是来自C标准库的函数,它生成介于0和定义 RAND_MAX
之间的伪随机数。如果您使用C ++,请添加标题<cstdlib>
以使用它(而不是<stdlib.h>
) srand()可让您设置种子。如果每次运行应用程序时都需要新的种子,可以使用time()中的值进行种子处理。
2001年的 POSIX标准具有 rand()和 srand()的示例实现。我从我的手册页复制粘贴它。 C标准库使用的实现可能与此不同:
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}
此外,&amp; 从该函数中获取地址。编译器在这方面有点含糊不清。当您需要来自函数指针的地址时,有些需要使用此运算符;别人不这样做。 生成是来自C ++标准库的<algorithm>
标头的函数。它接受函数和/或函子对象,并使用它为您指定的迭代器生成容器的值。
答案 2 :(得分:2)
rand
在cstdlib中定义。你获得相同的价值,因为你使用相同的“种子”。这是设计的。
如果您想要其他种子,请先致电srand
,例如srand(time(NULL));
。
答案 3 :(得分:0)
rand()是一个属于标准C库的函数。它的签名是:
int rand(void);
它在stdlib.h中定义。最有可能的是,std C ++库的实现包含了包含的头文件或。
答案 4 :(得分:0)
&rand
仅表示“rand
的地址”。 rand
是标准库中的函数,它返回伪随机数。你正在做的是将这个函数的地址传递给算法。然后他们在工作过程中调用此函数。
就rand
本身而言,任何体面的C ++文档都会告诉你为什么它的行为与你观察的方式相同......(此处其他答案也是如此)