2009-11-06 70 views
2

这是一些C++代码的摘录,我将有详细些日子来解释:C++:&rand做了什么?

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")); 

我想我明白它的一切,除了微小的神秘&兰特。它究竟做了什么?我的意思是显然它会产生一些伪随机数,但它们始终保持不变。 &兰特从哪里来?它是什么样的表达呢?它产生的价值从何而来?我有点困惑...

另外,我既没有在代码中发现任何其他出现的“rand”字样,也没有看到任何可能与随机数字有关的代码。这让我想知道,因为我在C++中的(非常有限的)经验表明,只有极少数事情可以工作,而不必事先声明或包含。

感谢您的帮助!

回答

13

& in &rand返回rand()函数的地址。您正在向generate()传递函数指针,因此generate()可以调用rand()来生成随机数。

2

rand在cstdlib中定义。你获得相同的价值,因为你使用了相同的“种子”。这是设计。

如果您想要一个不同的种子,请先拨打srand,例如srand(time(NULL));

+0

它是'rand'不是'rnd'。 – 2009-11-06 01:30:12

+0

乌,错别字将是我的死亡。谢谢肯。 – 2009-11-06 01:31:04

+0

嗯不能决定你的或肯的答案是更好的,但组合正是我所需要的。谢谢! – 2009-11-06 01:37:01

0

rand()是一个函数,它是标准C库的一部分。它的签名是:

int rand(void); 

它在stdlib.h中定义。最有可能的是,当你包含or时,你的std C++库的实现就包含了这个头文件。

0

&rand只是表示“地址rand”。 rand是从返回伪随机数的标准库中的函数。你正在做的是将这个函数的地址传递给算法。然后他们在工作过程中调用这个函数。

至于rand本身推移,任何像样的C++文件将告诉你为什么它的行为你观察的方式......(和其他的答案在这里做的一样好)

5

兰特()是函数从C标准库生成伪随机数在0和定义之间RAND_MAX。如果使用C++,请使用头文件<cstdlib>来使用它(而不是<stdlib.h>srand()可让您设置种子。如果每次运行应用程序时都需要一个新种子,则可以使用time()中的值进行种子处理。

POSIX标准从2001年具有一个例子的实现兰特()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; 
} 

此外,&从函数接收地址。编译器在这个部分有点模糊。当你需要函数指针的地址时,有些需要使用这个操作符;别人不会。 生成是来自C++标准库的<algorithm>标题中的函数。它接受函数和/或函子对象,并使用它为容器指定的迭代器生成值。