Случайное перемешивание с использованием вектора

0

Я пытаюсь создать не повторяющийся индекс (0-51) в массиве и хранить в нем целые числа. Но выход кажется странным. Ниже мой код:

#include <iostream>     // std::cout
#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

// random generator function:
int myrandom (int i)
{
    return std::rand()%i;
}

int main ()
{

  int* temp = new int[52];

  std::srand ( unsigned ( std::time(0) ) );
  std::vector<int> myvector;

  // set some values:
  for (int i=0; i<52; ++i) myvector.push_back(i);

  // using built-in random generator:
  std::random_shuffle ( myvector.begin(), myvector.end() );

  // using myrandom:
  std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);

  std::vector<int>::iterator it=myvector.begin();

  for(int i = 1;i<=24;i++)
  {
      temp[*it] = i;
      it++;

  }

  for(int i = 0;i<52;i++)
  {
      std::cout << temp[i];
      std::cout << '\n';
  }

  delete[]temp;
  temp = NULL;



  return 0;
}

Что здесь не так?

Out-put содержит очень большое количество, например: 1998373

Теги:
vector
random
shuffle

1 ответ

2
Лучший ответ

new int[52] возвращает неинициализированную память. Вы устанавливаете только 24 из этих значений, остальные остаются неинициализированными. Может быть, это:

for(int i = 1;i<=24;i++)
{
  temp[*it] = i;
  it++;
}

должен был быть

for(int i = 1;i<52;i++)
{
  temp[*it] = i;
  it++;
}

? Или задайте все значения в явном виде 0 после выделения.

  • 0
    Я уже пробовал это, это работает. Но я не хочу заполнять весь индекс в массиве.
  • 1
    @ 14K Затем установите для памяти значение 0 : for (int i=0; i<52; ++i) temp[i]=0; или что-то подобное (поместите это сразу после того, как вы установили temp с new ).
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню