Заполнение массива с++

261
23 февраля 2018, 18:31

Как заполнить двумерный массив числами от 1 к 15 в разброс и что бы они не повторялись.Мой вариант очень долгий. Возможно можно как-то по другому.И чем проще тем лучше

void filling (int ar[][size])
{
    srand(time(0));
    for (int r=0; r<size; r++)
        for (int c=0; c<size; c++)
        {
        res:
            ar[r][c]=rand()%16;
            for (int e=r; r>=0; e--)
                 for (int x=c; c>=0; x--)
                      if (ar[r][c] == ar[e][x]) goto res;
        }
}
Answer 1

Вот пример с cplusplus.com. Думаю, это как раз то, что Вам надо. основная идея - заполняете массив числами из нужного диапазона, а потом просто случайно перемешиваете.

// random_shuffle example
#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 () {
  std::srand ( unsigned ( std::time(0) ) );
  std::vector<int> myvector;
 // set some values:
 for (int i=1; i<16; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9 ...
 // using built-in random generator:
 std::random_shuffle ( myvector.begin(), myvector.end() );
 // using myrandom:
 std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);
 // print out content:
 std::cout << "myvector contains:";
 for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';
  return 0;
}

Пример немного избыточен, т.к. там показано как для перемешивания использовать еще и свою функцию (там можно не только равномерное распределение использовать). И естественно, для большей эффективности, можно еще добавить резервирование места в векторе перед добавлением элементов. Но для маленьких выборок - и так сойдет. Главная строчка здесь: std::random_shuffle ( myvector.begin(), myvector.end() );.

Что касается двумерности... В функцию его можно передавать как одномерный int *arr, но не забудьте передать и правильный размер. И потом можно просто скопировать содержимое вектора в Ваш массив (если по какой-то причине нельзя изначально работать с векторами).

Answer 2
void filling (int ar[][4]) {   
   std::vector<int> v(15, 1);
   std::partial_sum(v.begin(), v.end(), v.begin());
   std::random_shuffle(v.begin(), v.end());
   std::copy(v.begin(), v.end(), ar[0]);
}

собственно можно заполнить так любой массив с любым количеством цифр. Можно например и так

int f() {
    static int k = 0;
    return ++k;
}
void filling (int ar[][4]) { 
    std::generate(m[0], &m[3][3], f);
    std::random_shuffle(m[0], &m[3][3]);
}
Answer 3

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

void filling(int ar[][size]) {
    int *ar1 = &ar[0][0];    // массив любой мерности в c++ хранится смежно
    int m = 16;              // модуль ЛКГ
    int a = 5;               // множитель ЛКГ
    int c = 7;               // смещение ЛКГ
    int x = rand() % m;      // начальное значение элемента массива
    for (int i = 0; i < m; i++) {
        x = (a * x + c) % m; // очередное значение элемента массива
        ar1[i] = x;          // запиcываем
}   }

При указанных в примере коэффициентах будет выдана последовательность из 16-и неповторяющих чисел, которая используется в качестве элементов массива по индексу, равному счетчику цикла. Можно и наоборот -- ЛКГ генерирует индексы, а пишутся счетчики цикла.

Требования, которым должны удовлетворяь коэффициенты и модуль ЛКГ, приведены в википедии. Приведенный алгоритм без изменений работает для любых массивов любой размерности.

READ ALSO
вывод массива после сортировки

вывод массива после сортировки

Допустим, если в векторе числа лежат числа 10 5 2, то сортировка выдаст мне 2 5 10Как сделать так, чтобы он мне вывел 3 6 11 без изменения самих чисел...

196
Как сделать подсчет очков в игре?

Как сделать подсчет очков в игре?

Как сделать подсчет очков по удаляемым линиям? Допустим убралась линия - плюс 40 очковПишу в Visual Studio 2017

418
Чем чревато закрытие программы через taskkill?

Чем чревато закрытие программы через taskkill?

Я хочу отловить момент, когда приложение пытаются закрыть и убить процесс своей же программы через taskkillСделать я это хочу, потому что при...

262