如何使用rand()强制显式随机性

时间:2013-07-20 21:18:23

标签: c++ random

#include <iostream>
#include <stdlib.h>
#include <ctime>

class Minesweeper {
   public:
       void buildBoards();
       void printTopLvlBoard();
       void printBottomLvlBoard();
       void userEntry(int x, int y);
       void gameOver();
       bool stateGood();
   private:
       static const int CLMN_MAX_SIZE = 5;
       static const int ROW_MAX_SIZE = 5;
       char topLvlBoard[ROW_MAX_SIZE][CLMN_MAX_SIZE];
       char bottomLvlBoard[ROW_MAX_SIZE][CLMN_MAX_SIZE];
       bool gameState;
   };

void Minesweeper::printTopLvlBoard(){
    std:: cout << "Board" << std:: endl;
    for(int i = 0; i < ROW_MAX_SIZE; i++) {
       for(int j = 0; j < CLMN_MAX_SIZE; j++) {
          std::cout << topLvlBoard[i][j];
       }
    std::cout << std::endl;
    }
}

void Minesweeper::buildBoards(){
   for(int i = 0; i < ROW_MAX_SIZE; i++){
       for(int j = 0; j < CLMN_MAX_SIZE; j++){
           bottomLvlBoard[i][j] = 'O';
           topLvlBoard[i][j] = 'x';
       }
   }
   for(int k = 0; k < 5; k++) {
       bottomLvlBoard[**rand()%5**][**rand()%5**] = 'B';
   }
   gameState = true;
}

void Minesweeper::printBottomLvlBoard(){
   for(int i = 0; i < CLMN_MAX_SIZE; i++){
      for(int j = 0; j < ROW_MAX_SIZE; j++){
        std::cout << bottomLvlBoard[i][j];
      }
      std::cout << std:: endl;
   }
}  

void Minesweeper::userEntry(int x,int y){
   char bottomTmp = bottomLvlBoard[x-1][y-1];

   if(bottomTmp == 'O'){
      topLvlBoard[x-1][y-1] = '*';
      bottomLvlBoard[x-1][y-1] = 'C';
   }
   else if(bottomTmp == 'B'){
      gameOver();
   }
}
void Minesweeper::gameOver() {

  std::cout << std:: endl;
  std::cout << "**********************" << std:: endl;
  std::cout << "**********************" << std:: endl;
  std::cout << "*** BOMB BOMB BOMB ***" << std:: endl;
  std::cout << "*** BOMB BOMB BOMB ***" << std:: endl;
  std::cout << "*** BOMB BOMB BOMB ***" << std:: endl;
  std::cout << "*** BOMB BOMB BOMB ***" << std:: endl;
  std::cout << "**********************" << std:: endl;
  std::cout << "**********************" << std:: endl;
  std::cout << std:: endl;

  std::cout << "You have landed on a bomb!" << std:: endl;
  std::cout << std:: endl;

  printBottomLvlBoard();
  gameState = false;
}

bool Minesweeper::stateGood(){
   bool tmpYesNo = (gameState == true) ? true : false;
   return tmpYesNo;
}

无论如何通过rand()函数强制显式随机性?每次我运行这个程序时,我都会在整个网格中获得相同的可预测炸弹模式。即使我在main()中更改种子,我仍然只能得到大约3种模式的变体。

3 个答案:

答案 0 :(得分:1)

首先用种子初始化伪随机生成器(PRNG),一种简单的方法是使用如下的当前时间。

 #include <ctime>

 // and put the following before calling rand, and where it is only called once
 srand(time(NULL));

即。调用srand的好地方可以是main()函数的开头。

答案 1 :(得分:0)

请参阅Why do I always get the same sequence of random numbers with rand()?

实质上,没有种子的rand()将始终返回相同的伪随机数数组 - 在这种情况下,种子通常为'1'。带有固定种子的rand()将始终返回相同的伪随机数数组。

答案 2 :(得分:0)

如果在最初调用srand(n)(srand()仅在main的开头调用一次)之后在程序中稍后重复运行rand()并使用不同的n值,并且基本上你得到一个小集合的副本当您期望更多样化的结果时,结果,然后在数学上几乎可以保证问题不在于rand() - 它是您如何使用随机数。也就是说,可以使用“真随机性”作为算法的一部分,但仍然使您的算法倾向于以高概率收敛到公共状态(或几个常见状态之一)。

查看您的代码,您没有提供一个main()或描述您正在打印的时间/正在提供“相同3种模式的变体”,或描述了3种模式的确切含义,或者描述了你期望看到的其他类型的模式。如果没有这些信息,将很难更深入地了解您的问题。也许3种模式的所有“变化”都是人们期望看到的,很有可能。