在for循环奇怪的函数srand行为; C ++(Strange srand behaviour

2019-06-26 09:38发布

只需编写一个程序来洗牌一副扑克牌,并获得取决于RNG是否内部或外部的for循环播种不同的行为; 即。

  for(int i = 0; i < 52; i++)
{
  srand(time(0));  
  Card temp = deck[i];
  int toSwap = rand()%52;
  deck[i] = deck[toSwap];
  deck[toSwap] = temp;
}

使输出

Nine of Hearts
Ace of Clubs
Two of Clubs
Three of Clubs
Four of Clubs

等,但

void DeckOfCards::shuffle()
{
  srand(time(0));  
  for(int i = 0; i < 52; i++)
  {
  Card temp = deck[i];
  int toSwap = rand()%52;
  deck[i] = deck[toSwap];
  deck[toSwap] = temp;
  }
  currentCard =0;
}

导致

Ace of Hearts
Queen of Spades
Four of Hearts
Seven of Clubs
Five of Hearts

(正确的功能)。 任何人都知道为什么再接种RNG会导致此?

Answer 1:

随着时间的(NULL)仅改变每一秒时,RNG种子将是,如果for循环并不需要超过一秒钟来完成相同的。



Answer 2:

只需要,如果你需要的伪随机量一旦种子。 如果调用函数srand很多次,如果你之前时钟种子的变化做,那么你会得到相同的价值观,而不是随机的。 刚刚开始播种一次。 您可以打开其他程序(Winamp的等),以获得更多的随机值(你需要放慢你的程序)或随机迭代使空循环可以解决的第一个程序。 但你需要非常大的随机量如2个亿(必须是小于4十亿))



Answer 3:

当其他人是完全正确的,你不希望使用函数srand(时间(0))在循环中,因为你会得到随机性较差,因为你重复设置相同的种子,你不妨记住这一点进行调试:如果你需要能够“重播”的情况下,种子写出到日志文件,并允许种子的显式设置。 否则,用随机数字应用程序的调试可以是相当棘手的...



Answer 4:

您可以使用升压POSIX时间来代替。

但在任何情况下,如果你需要调用函数srand只有两次,就可以使用两个不同的固定值。

或者我用这个函数获取毫秒的时间

 inline long
    getTimeMs ()
    {
      struct timeval start;
      long mtime;

      gettimeofday (&start, NULL);

      mtime = ((start.tv_sec) * 1000 + start.tv_usec / 1000.0) + 0.5;

      return mtime;
    }

问候



文章来源: Strange srand behaviour inside for loop; c++
标签: c++ srand