2011-02-13 103 views
3

你好亲爱的stackoverflow成员我最近开始学习C++,今天我写了一个小游戏,但我的随机函数无法正常工作。当我多次调用我的随机函数时,它不会重新生成一个数字,而是一遍又一遍地打印相同的数字。我怎样才能解决这个问题,而不使用循环? 谢谢C++随机int函数

#include "stdafx.h" 
#include <iostream> 
#include <time.h> 
using namespace std; 
int rolld6(); 

int main() 
{ 
    cout<<rolld6()<<endl; 
    cout<<rolld6()<<endl; 
    system("PAUSE"); 
    return 0; 

} 

int rolld6() 
{ 
    srand(time(NULL)); 
    return rand() % 6 + 1;; 
} 

回答

10

srand(time(NULL));通常应该完成一次main()的开始处并且不再次。

你拥有了它会在您每次在相同的第二呼叫rolld6时间给你相同数量的方式,这可能是一个很多次和,你的样品中,被附近的保证,因为你在快两倍叫它演替。

试试这个:

#include "stdafx.h" 
#include <iostream> 
#include <time.h> 
#include <stdlib.h> 

int rolld6 (void) { 
    return rand() % 6 + 1; 
} 

int main (void) { 
    srand (time (NULL)); 
    std::cout << rolld6() << std::endl; 
    std::cout << rolld6() << std::endl; 
    system ("PAUSE"); 
    return 0; 
} 

的另一件事要记住的是,如果你连续快速地运行这个程序本身的两倍。如果时间没有改变,你会在两次运行中得到相同的两个数字。当你有一个脚本多次运行程序并且程序本身很短时,这通常只是一个问题。

例如,如果你把你的system()电话,有一个cmd.exe脚本调用它三次,你可能会看到这样的:

1 
5 
1 
5 
1 
5 

这不是你通常会做什么,但应该牢记这种情况很可能会出现。

+0

非常感谢!你的样品解决了我的问题。 – Error1 2011-02-13 02:38:04

8

您不断重新生成随机数发生器。在程序开始时只拨打srand(time(NULL));一次。

0

随机函数(不管语言)只是部分随机的。

在每一个技术,你将有一个相当于

srand(time(NULL)); 

这片码种子随机函数的初始值,然后将号码从那里开始 这意味着,如果生成的你总是补种形成相同的值,你总是会得到相同的数字

在你的情况下,你想要做这样的事情(调用srand(time(NULL));只有一次)。

int rolld6 (void) { 
    return rand() % 6 + 1;; 
} 

int main (void) { 
    srand (time (NULL)); 
... 
//call your function here 
} 

的具有相同值的播种的优点之一是提供以再生的随机数相同的序列的可能性。在我的一个游戏中,我会随机在屏幕上放置对象,但我也想实现一个重试选项。这种从相同值再次播种的选项允许我在不存储所有随机值的情况下重做它。^^

+3

你的第一个陈述并不真实。一些现代系统在硬件中包含真正的随机数发生器。这些可以在Linux上作为`/ dev/random`访问,不需要播种。 – MSalters 2011-02-14 10:48:58