Как именно мне реализовать алгоритм перетасовки или случайных чисел для массива для отображения котировок в случайном порядке?

Я уже знаю, что есть ответы на такие вещи, но я действительно не знаю, как реализовать их в своем коде. Кроме того, я хотел бы воздержаться от использования каких-либо дополнительных функций без необходимости. Вот мой код:

int main()
{
 unsigned seed;
 seed = 1;
 srand(seed);
 std::string starFox[8];
 int x[8];
 starFox[0] = "Do a barrel roll!";
 starFox[1] = "Try a somersault!";
 starFox[2] = "Use bombs wisely!";
 starFox[3] = "Something is wrong with the G-diffuser";
 starFox[4] = "Can't let you do that, Star Fox";
 starFox[5] = "Hey Einstein, I'm on your side";
 starFox[6] = "Whoa! help me!";
 starFox[7] = "Daddy screamed REAL good before he died!";

 for(int i=0; i<8; i++)
 {
  int y = 0 + rand() % 8;
  x[i] = y;

  if (x[i-1]!=y || x[i-2]!=y || x[i-3]!=y || x[i-4]!=y || x[i-5]!=y || x[i-6]!=y || x[i-7]!=y)
  {//now I need to make a statement that makes sure each number appears once.
   std::cout << starFox[y] << "\n";}
 }
 std::cout << '\n';

 return 0;
}

Итак, что мне нужно изменить в этом коде, чтобы он генерировал случайные числа при каждом выполнении программы?


person Mr. Czar    schedule 02.07.2010    source источник
comment
См. карты" title="Каков наиболее эффективный способ выбрать случайную карту из колоды, когда некоторые карты"> stackoverflow.com/questions/1133942/ среди прочих.   -  person    schedule 03.07.2010


Ответы (5)


Вы задаете одно и то же значение при каждом запуске, поэтому вы всегда будете получать одну и ту же псевдослучайную последовательность. Попробуй это:

srand(time(0));
person Fred Larson    schedule 02.07.2010

Используйте std::random_shuffle.

// Shuffle
std::random_shuffle(starFox, starFox + 8);

// And write to standard output
std::copy(starFox, starFox + 8,
          std::ostream_iterator<std::string>(std::cout, "\n"));
person R Samuel Klatchko    schedule 02.07.2010
comment
Спасибо, а куда мне их поместить в программе? И что я должен включить, чтобы избежать ошибок? - person Mr. Czar; 03.07.2010
comment
@Г-н. Царь: Этот код заменит ваш цикл for. Вам понадобится #include <algorithm> - person Fred Larson; 03.07.2010
comment
О, и #include <iterator> - person Fred Larson; 03.07.2010

Решение случайного перемешивания:

  • Поместите все числа, которые вы хотите перетасовать, в контейнер (вектор) (назовите его src)
  • Создайте пустой контейнер, в который будут помещены числа по мере их случайного выбора (назовите его dst).
  • while (src is not empty)
    • Generate a random number [0,len(src)) (Note not inclusive)
    • Удалить элемент в src[Rand]
    • Поместите удаленный элемент в dst
person Martin York    schedule 02.07.2010

Вместо того, чтобы использовать массив для отслеживания того, какие из них были просмотрены, как насчет того, чтобы сохранить цитаты в списке и просто удалить цитату после того, как она была использована.

person Eric Petroelje    schedule 02.07.2010

Ознакомьтесь с этим решением для случайного перемешивания.

person Roy Truelove    schedule 02.07.2010