2017-07-17 19 views
1

每当我们想从一个向量中选择一个随机数时,我们使用一个名为rand()的方法。我想知道它是如何从后端工作的。cpp的rand()方法的bankend程序是什么

+2

如果你想了解关于伪随机数生成的理论,你需要阅读大量的数学和统计数据。如果您只想查看一些生成伪随机数的示例函数,那么如果您只是搜索一些,包括一些标准库是开源的,那么这里有很多可用的函数。 “ –

回答

1

rand没有涉及"back-end"

顺便说一句,在C++中,您最好使用<random>标准头文件和相关实用程序,它们位于C++ standard library中。

rand功能是C standard library的一部分。它与C++向量无关。

它们(rand函数和<random>的实用程序)均基于pseudo-random number generators,这是一个相当复杂的字段。你仍然可以通过发明更好的PRNG获得博士学位。

如果你想了解如何rand是(或可以)来实现,你会更好地研究一些现有的free software C标准库的源代码(如GNU例如或glibcmusl-libc)。

如果您想了解如何实现<random>,请研究C++标准库的源代码。如果使用GCC编译器(例如使用g++程序进行编译),则由其提供。

1

rand具有种子值 - 例如,将其设置为当前时间...

srand(time(NULL)); // second good enough 

然后有一些数学如本....

unsigned int seed; // set by srand 
unsigned int rand() { 
    seed = seed * number + offset; 
    return seed; 
} 

的数目和偏移被选择,所以整个的`的范围内的覆盖了unsigned int。这通常意味着某种形式的质数。

正如评论中所述,这是一个非常复杂的领域。

如果没有调用srand,那么seed有一个初始值,这意味着(忽略线程计时问题),每次运行时,程序都会得到相同的结果。

获得相同的结果对于重新运行测试非常方便,但如果它是游戏逻辑,则会出现问题。

+0

”选择数字和偏移量,所以'unsigned int'的整个范围都被覆盖“ - False。整个范围是'0-UINT_MAX',但'rand()'只需要覆盖'0-RAND_MAX'。这可能低至32767. – MSalters

+0

这个(线性同余发生器)是'rand()'的一种可能的实现。这是很常见的,但C和C++都不需要这种方法,有些实现的做法是不同的。 –

相关问题