MK2266 Ответов: 2

Генератор случайных двоичных чисел


Привет
Я написал этот фрагмент кода для генерации случайного двоичного числа с двумя циклами for следующим образом:

<pre>srand(time(0));
	for (i = 1; i <= 11; i++)                                                               
	{                                                                                       
		buffer.push_back(i);
	}
	for (i = 1; i <= buffer.size(); i++)
	{
		buffer[i] = rand() % 2;
		std::cout << buffer[i] % 2 << " ";
	}
	std::cout << std::endl;



есть 2 проблемы :
1) когда я заменяю его в нужном месте во всем моем коде, компилятор(в visual studio 2017) выдает мне предупреждение об этой строке: srand(time(0)); that (Warning C4244 'argument': преобразование из 'time_t' в 'unsigned int', возможная потеря данных)

2)как я могу уменьшить количество циклов for, чтобы иметь только один цикл for?

Что я уже пробовал:

<pre lang="c++">
srand(time(0));
	for (i = 1; i <= 11; i++)                                                               
	{                                                                                       
		buffer.push_back(i);
	}
	for (i = 1; i <= buffer.size(); i++)
	{
		buffer[i] = rand() % 2;
		std::cout << buffer[i] % 2 << " ";
	}
	std::cout << std::endl;

2 Ответов

Рейтинг:
2

Rick York

Почему вы принимаете модуль два дважды? Собственно, зачем вообще это делать? Обычно способ использования rand заключается в том, что вы определяете диапазон для своих значений и записываете его как

value = rand() % maxValue;
Тогда значения будут иметь диапазон от нуля до максимального значения. В разделе "Что вы пробовали" первый цикл служит только для инициализации вектора. Это можно было бы записать так :
for( i = 0; i < valueCount; ++i )
{
    int value = rand() % maxValue;
    buffer.push_back( value );
}
Вам нужно определить переменные valueCount и maxValue, чтобы сделать это полезным. Возврат rand будет варьироваться от 0 до RAND_MAX. Вы можете инициализировать вектор до заданного размера с помощью reserve(). Если вы знаете, сколько их у вас будет, это может быть хорошей идеей. В основном для больших количеств, так что никаких перераспределений нет.


Рейтинг:
1

KarstenK

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

srand((unsigned int) time(0));

for (i = 1; i <= 11; i++)                                                               
{                                                                                       
	buffer.push_back(i);

	buffer[i] = rand() % 2;
	std::cout << buffer[i] << " ";// giving the result out ???
}


MK2266

не могли бы вы также решить ошибку, которая существует в моем письменном коде?