Mat 257 Ответов: 4

C ++, Как заполнить 5 элементов int вектора функцией


Я объявил в основном массив переменных int abc [5], я хочу заполнить его 5 случайными числами в диапазоне от 0 до 4. ниже код заполняет массив тем же числом, скажем 33333. Я хочу 23442 или 11133 или 34341 и так далее

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

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int  CarteACaso ()
{
 int NumeroCarte;
srand((int)time(0));
NumeroCarte= (rand() % 4) + 1;
return NumeroCarte;
}


int main()
{
int gioco[5];
  
 for(int P=0; P<5; P++)
{ int Prova;
Prova=CarteACaso();
gioco[P]=Prova;
cout<<"gioco  "<<P<<"  "<<gioco[P]<<endl;
}

return 0;
}

KarstenK

совет: используйте srand() только один раз. Это сокращение от "start randomize" :-O

4 Ответов

Рейтинг:
36

Greg Utas

Вы призываете srand каждый раз вы получаете случайное число. Это "семена" то rand функция. Хотя вы используете time(0), ваш код будет работать так быстро, что time(0) вероятно, имеет одно и то же значение каждый раз, когда приводится в качестве int Это приведет к тому, что rand чтобы каждый раз возвращать одно и то же значение. Переместите вызов на srand к началу main и все, вероятно, наладится.


Рейтинг:
2

Patrice T

Совет: Научитесь правильно делать отступы в вашем коде, это покажет его структуру и поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int  CarteACaso () {
	int NumeroCarte;
	srand((int)time(0));
	NumeroCarte= (rand() % 4) + 1;
	return NumeroCarte;
}

int main() {
	int gioco[5];
	for(int P=0; P<5; P++) {
		int Prova;
		Prova=CarteACaso();
		gioco[P]=Prova;
		cout<<"gioco  "<<P<<"  "<<gioco[P]<<endl;
	}
	return 0;
}

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]


Рейтинг:
2

Mat 257

привет, ребята, спасибо за ваши ценные советы.
что касается отступов, то я читал ссылки, но заблудился, там много стилей.
я постараюсь использовать тот, который вы предложили в посте. я использую dev c++.
как вы уже поняли, я новичок.
я очень рад, что познакомился с этим сайтом. это жизненно важно для моего обучения. скорее всего, я задам кучу вопросов, это единственный способ, которым я должен учиться. спасибо еще раз.


Рейтинг:
17

Rick York

Как уже упоминалось, вызов srand должен быть перемещен из этой функции в main, поэтому он вызывается один раз.

У вас также есть проблема с тем, как вы используете возврат из rand(). Вы заявили, что вам нужны случайные значения от 0 до 4. Функция возвращает случайные значения от 0 до RAND_MAX с типичным значением 32K. Вы добавляете единицу к результату возврата по модулю 4. Это означает, что значения будут варьироваться от 1 до 4. Вот функция, которая будет возвращать значения в указанном диапазоне.

int GetRandomValue( int minval, int maxval )
{
    int range = maxval - minval + 1;
    int rval = rand() % range;
    return rval + minval;
}
Вам нужны числа в диапазоне от 0 до 4, поэтому вызовите эту функцию и передайте ей значения 0 и 4.

Вот код, который будет тестировать эту функцию :
void DoRandomValueTest()
{
    std::vector< int > values( 10, 0 );
    const int count = 1000;
    for( int n = 0; n < count; ++n )
    {
        int rv = GetRandomValue( 1, 8 );
        values[ rv ] += 1;
    }

    size_t valueCount = values.size();
    trace( _T( "random value vector has %d items\n" ), (int) valueCount );
    for( size_t i = 0; i < valueCount; ++i )
        trace( _T( "%2d : %4d times\n" ), (int) i, values[ i ] );
}
Вот результат теста :
21:04:02.279 TestThread_07   random value vector has 10 items 
21:04:02.279 TestThread_07    0 :    0 times 
21:04:02.279 TestThread_07    1 :  129 times 
21:04:02.279 TestThread_07    2 :  143 times 
21:04:02.279 TestThread_07    3 :  116 times 
21:04:02.279 TestThread_07    4 :  113 times 
21:04:02.279 TestThread_07    5 :  119 times 
21:04:02.279 TestThread_07    6 :  135 times 
21:04:02.279 TestThread_07    7 :  129 times 
21:04:02.279 TestThread_07    8 :  116 times 
21:04:02.279 TestThread_07    9 :    0 times
Как видите, все значения находятся в диапазоне от 1 до 8. Распределение достаточно плоское для такого небольшого диапазона.