【问题标题】:Srand() and rand() still generating the same random numberSrand() 和 rand() 仍然生成相同的随机数
【发布时间】:2021-06-03 06:59:18
【问题描述】:

对不起,我是 C++ 新手,但我尝试按照 youtube 上的游戏教程进行操作,我认为逻辑有点错误,因为即使 srand 和 rand 函数,敌人的位置在运行时似乎也会创建一个模式被使用了,我认为使用了相同的随机数。

#include <iostream>
#include <curses.h>
#include <time.h>
using namespace std;

void gotoxy (int x, int y){
  move (y, x);
}

bool exitGame;
bool isMoving;
int mycatX;
int mycatY;
int enemyX[4];
int enemyY[4] = {-9, -19, -29,-39};
int enemyPositionX[3] = {3, 18 ,32};

void startUp () {
  mycatX = 18;
  mycatY = 15;
  srand(time(NULL));
  for(int i = 0; i < 4; i++){
    enemyX[i] = enemyPositionX[rand() % 3];
  }
}

void layout () {
  if (isMoving){
      gotoxy (0, 0); printw ("##                                       ##");
      gotoxy (0, 1); printw ("##            ||            ||           ##");
      gotoxy (0, 2); printw ("##                                       ##");
      gotoxy (0, 3); printw ("##            ||            ||           ##");
      gotoxy (0, 4); printw ("##                                       ##");                     
      gotoxy (0, 5); printw ("##            ||            ||           ##");
      gotoxy (0, 6); printw ("##                                       ##");
      gotoxy (0, 7); printw ("##            ||            ||           ##");
      gotoxy (0, 8); printw ("##                                       ##");
      gotoxy (0, 9); printw ("##            ||            ||           ##");
      gotoxy (0, 10);printw ("##                                       ##");
      gotoxy (0, 11);printw ("##            ||            ||           ##");
      gotoxy (0, 12);printw ("##                                       ##");
      gotoxy (0, 13);printw ("##            ||            ||           ##");
      gotoxy (0, 14);printw ("##                                       ##");
      gotoxy (0, 15);printw ("##            ||            ||           ##");
      gotoxy (0, 16);printw ("##                                       ##");
      gotoxy (0, 17);printw ("##            ||            ||           ##");
      gotoxy (0, 18);printw ("##                                       ##");
      gotoxy (0, 19);printw ("##            ||            ||           ##");
      gotoxy (0, 20);printw ("##                                       ##");
      isMoving = false;
    }else{
      gotoxy (0, 0); printw ("##            ||            ||           ##");
      gotoxy (0, 1); printw ("##                                       ##");
      gotoxy (0, 2); printw ("##            ||            ||           ##");
      gotoxy (0, 3); printw ("##                                       ##");
      gotoxy (0, 4); printw ("##            ||            ||           ##");
      gotoxy (0, 5); printw ("##                                       ##");
      gotoxy (0, 6); printw ("##            ||            ||           ##");
      gotoxy (0, 7); printw ("##                                       ##");
      gotoxy (0, 8); printw ("##            ||            ||           ##");
      gotoxy (0, 9); printw ("##                                       ##");
      gotoxy (0, 10);printw ("##            ||            ||           ##");
      gotoxy (0, 11);printw ("##                                       ##");
      gotoxy (0, 12);printw ("##            ||            ||           ##");
      gotoxy (0, 13);printw ("##                                       ##");
      gotoxy (0, 14);printw ("##            ||            ||           ##");
      gotoxy (0, 15);printw ("##                                       ##");
      gotoxy (0, 16);printw ("##            ||            ||           ##");
      gotoxy (0, 17);printw ("##                                       ##");
      gotoxy (0, 18);printw ("##            ||            ||           ##");
      gotoxy (0, 19);printw ("##                                       ##");
      gotoxy (0, 20);printw ("##            ||            ||           ##");
      isMoving= true;
        
    }
}

void mycat ()
{
  gotoxy (mycatX, mycatY);     printw ("   ^^   ");
  gotoxy (mycatX, mycatY +1);  printw ("=( ^ ^)=");
  gotoxy (mycatX, mycatY + 2); printw ("  o  o ");
  gotoxy (mycatX, mycatY + 3); printw ("  (  )  ");
  gotoxy (mycatX, mycatY + 4); printw ("    \\   ");

}

void enemymouse ()
{
  for(int i = 0; i < 4; i++){
      if(enemyY[i] >= 0){
        gotoxy (enemyX[i], enemyY[i]);       printw ("  \\/ ");
        }
      if(enemyY[i]+1 >= 0){gotoxy (enemyX[i], enemyY[i] + 1); printw ("  ()  ");}
      if(enemyY[i]+2 >= 0){gotoxy (enemyX[i], enemyY[i] + 2); printw (" /  \\");}
      if(enemyY[i]+3 >= 0){gotoxy (enemyX[i], enemyY[i] + 3); printw ("((__))");}
      if(enemyY[i]+4 >= 0){gotoxy (enemyX[i], enemyY[i] + 4); printw ("   |  ");}    
         
         
          
      if(enemyY[i] > 20){gotoxy (enemyX[i], enemyY[i]);       printw ("         ");}
      if(enemyY[i]+1 > 20){gotoxy (enemyX[i], enemyY[i] + 1); printw ("         ");}
      if(enemyY[i]+2 > 20){gotoxy (enemyX[i], enemyY[i] + 2); printw ("         ");}
      if(enemyY[i]+3 > 20){gotoxy (enemyX[i], enemyY[i] + 3); printw ("         ");}
      if(enemyY[i]+4 > 20){gotoxy (enemyX[i], enemyY[i] + 4); printw ("         ");}
      if(enemyY[i] > 20) enemyY[i] = -10;
      enemyY[i]++;  
    }    
}
 

void controller (){
  nodelay (stdscr, TRUE);
  switch (getch ()) {
    case 'a':
      mycatX = mycatX - 13;
      break;
    case 'd':
      mycatX = mycatX + 13;
      break;
    case 'w':
      mycatY = mycatY - 2;
      break;
    case 's':
      mycatY = mycatY + 2;
      break;


    }

}

int main (){
  initscr ();
  startUp ();
  noecho ();
  scrollok (stdscr, TRUE);
  nodelay (stdscr, TRUE);
  while (!exitGame){
      layout ();
      mycat ();
      enemymouse ();
      controller ();
      napms(200);
      curs_set(0);
    }

  return 0;
}

【问题讨论】:

  • Srand 播下了种子。您将种子设置为您的时间,然后使用 rand() 所以没有发生异常情况。
  • 如果您使用任何现代同类的 C++ 并且没有使用 &lt;random&gt; 来满足您的随机生成器需求,您需要调查一下。您会对可用的选项更加满意。
  • 判断是否使用了相同的随机数的方法是编写一个(更简单的)程序,只调用几次rand() 并显示值。如果您看到该程序的模式,那么您已经确定了问题。

标签: c++ random numbers


【解决方案1】:

rand() 实际上并不生成真正的随机数,而是伪随机数。因此,如果您最终开始注意到一种模式,这还不错,因为实际上有一个规则可以选择“随机”数字。

有关更多信息,请参阅其他帖子,例如:

srand(time(NULL)) generating similar results

c++ random doesn't work(returns same value always)

【讨论】:

  • 你知道我怎样才能删除那个模式吗?我尝试将 与 mersenne twister 一起使用,但它仍然不起作用。
  • 您无法“删除”该模式。没有一个程序会巧合地运行——程序按照它们的指示运行。有办法让它更复杂,更难预测,但它永远不会实现真正的随机性。
  • 实际上...如果您使用真正的随机数播种(无论这可能意味着什么——通常更随机意味着更难预测),您可以在系统中引入一些真正的随机性。对于某些人来说,真正的随机性意味着检查一只可能死去的猫。对于大多数人来说,决定他们告诉某项运行的毫秒数通常就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2021-10-23
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多