c ++:&rand究竟做了什么?

Pat*_*ity 2 c++ random iterator stl function-pointers

这是一些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"));
Run Code Online (Sandbox Code Playgroud)

我想我理解它的一切,除了那个微小的神秘和兰德.究竟是做什么的?我的意思是它显然产生某种伪随机数,但它们总是保持不变.&rand来自哪里?它是什么样的表达方式?它产生的价值来自哪里?我有点困惑......

此外,我既没有在代码中找到任何其他出现的"rand"一词,也没有看到任何可能与随机数有关的代码.这让我很奇怪,因为我(非常有限)的c ++经验表明,只有很少的东西可以简单地工作,而不必事先声明或包含.

谢谢你帮忙!

Ken*_*oom 13

&&rand返回的地址rand()功能.您正在传递一个函数指针,generate()因此generate()可以调用rand()生成随机数.


小智 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;
}
Run Code Online (Sandbox Code Playgroud)

此外,&取得函数的地址.编译器在这方面有点含糊不清.当您需要来自函数指针的地址时,有些需要使用此运算符; 别人不这样做.generate<algorithm>来自C++标准库的头文件中的函数.它接受函数和/或函数对象,并使用它为您指定的迭代器生成容器的值.