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

时间:2009-11-06 01:23:51

标签: c++ stl iterator function-pointers random

这是一些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 ++经验表明,只有很少的东西可以简单地工作,而不需要先申报或包括在内。

感谢帮忙!

5 个答案:

答案 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 ++文档都会告诉你为什么它的行为与你观察的方式相同......(此处其他答案也是如此)