Informatikum
@Informatikum
Преподаю робототехнику и информатику в школе.

Как в С++ генерировать последовательность чисел без повторов?

Здравствуйте.

Необходимо генерировать 2-х мерный массив из 0 и 1. Использую стандартный random (rand, srand). Хочу посчитать, сколько выпадет нулей и единиц из 100 генераций массива, и сколько будет повторов аналогичных комбинаций. Запускаю программу, генерируются один в один копии без отличий.

С++, Linux.

#include <iostream>
#include <cstdlib>
#include <ctime>

#define m_size 3

using namespace std;

void randM()
{
 	srand((unsigned int)time(0));

 	int mas[m_size][m_size];

 	int countZ = 0;
 	int countO = 0;

 	for (int i = 0; i < m_size; i++)
 	{
 		for (int j = 0; j < m_size; j++)
 		{
 			mas[i][j] = rand() % 2;
 			if (mas[i][j] == 0)
 				countZ++;
 			else
 				countO++;
 		}
 	}

 	for (int i = 0; i < m_size; i++)
 	{
 		for (int j = 0; j < m_size; j++)
 		{
 			cout << mas[i][j];
 		}
 		cout << endl;
 	}	

 	cout << "countZ: " << countZ << endl;
 	cout << "countO: " << countO << endl;
}


int main()
{
    //system("clear");
    setlocale(LC_ALL, "Russian");

    int repeat = 0;

    while(repeat < 3)
    {
    	randM();
    	repeat++;
    	cout << endl;
    }

	return 0;
}


Была мысль выбрасывать цифры от 0 до 9 и переводить их в двоичный код, заменяю и дополняя 0 и 1.

Прикрутить urandom пока не получилось. Прошу помочь разобраться.
  • Вопрос задан
  • 3688 просмотров
Пригласить эксперта
Ответы на вопрос 3
@kstyle
вынесите из функции srand и вставьте в main
Ответ написан
gbg
@gbg Куратор тега Linux
Любые ответы на любые вопросы
Этот вариант подойдет, если не требуется криптостойкий ГСЧ.
Используйте bitset:
#include <iostream>
#include <bitset>
#include <stdlib.h>
using namespace std;
int main()
{
    const auto slen=8*sizeof(rand());
    bitset<slen> a(rand());
    for(auto i=0;i<slen;i++)
    {
       cout << a[i] << ' ';
    }
}
Ответ написан
Комментировать
donkaban
@donkaban
Умею рисовать тени
Стоит почитать здесь - www.cplusplus.com/reference/random
И перестать "использовать стандартный random". Ну и seed надо задавать вне функции, само собой. Получить же случайную последовательность нулей и единиц проще, наверное в bitset, чем в массив
Если попроще, то :
#include <random>
template <typename T>
T random()
{
   static std::mt19937 rng;
   std::uniform_int_distribution<T>
       dist(std::numeric_limits<T>::min(),std::numeric_limits<T>::max());
   return dist(rng);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы