Форум программистов, компьютерный форум CyberForum.ru

Про рандом - C++

Восстановить пароль Регистрация
 
sergey1993
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 79
24.05.2013, 14:24     Про рандом #1
Как с++ одномерный массив из 10 элементов прорандомить так ,чтобы все элементы массива в сумме давали 1000 и были положительными (ноль нельзя)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 14:24     Про рандом
Посмотрите здесь:

рандом C++
Рандом C++
C++ Про рандом
рандом C++
рандом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
24.05.2013, 14:52     Про рандом #2
sergey1993, например, можно рандомно задать 9 элементов в диапазоне от 1 до 100
C++
1
mas[i] = rand() % 100 + 1;
а последний посчитать как разницу(тысяча минус первые 9 элементов). Хотя так последний элемент большой будет получаться.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
24.05.2013, 14:56     Про рандом #3
C++
1
2
3
4
5
6
7
8
9
10
    int base = 100, array[10], del, sum = 0;
    del = 1000 - base;
    array[0] = rand() % del;
    for (int num = 1; num < 9; num++)
    {
        del -= array[num - 1];
        array[num] = rand() % del;
    }
        del -= array[num - 1];
        array[num] = del;
Не лучший вариант конечно, но все-таки. base - база чтобы элементы не были нулевыми. делиться на все элементы.
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
24.05.2013, 15:17     Про рандом #4
Ilot, что-то массив получается не тот, что нужно, не в обиду)
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
24.05.2013, 15:32     Про рандом #5
Ок проверте у себя. У меня все в порядке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<windows.h>
#include<iostream>
#include<conio.h>
using namespace std;
 
//*****************************************
int main() 
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);   
 
    int base = 100, array[10], del, sum = 0;
    del = 1000 - base;
    array[0] = rand() % del;
    for (int num = 1; num < 9; num++)
    {
        del -= array[num - 1];
        array[num] = rand() % del;
    }
        del -= array[num - 1];
        array[num] = del;
 
    for (num = 0; num < 10; num++)
    {
        cout << array[num] + base / 10 << ' ';
        sum +=  array[num] + base / 10;
    }
    cout << endl << sum;
 
    getch();
    return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,831
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 15:41     Про рандом #6
Как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <ctime>
class MyFunctor{
public:
    MyFunctor(int arg_min,int arg_max,size_t arg_count):
                                    mMin(std::min(arg_min,arg_max)),
                                    mMax(std::max(arg_min,arg_max)-arg_count),
                                    mCount(arg_count){
        srand(time(NULL));
    }
    void operator()(int & src){
        --mCount;
        ++mMax;
        if(mCount){
            src=rand()%(mMax-mMin+1)+mMin;
        }
        else{
            src=mMax;
        }
        mMax-=src;
    }
private:
    int mMin;
    int mMax;
    int mCount;
};
 
 
int main(){
    int myMin=1,myMax=1000;
    size_t count=10;
    std::vector<int> vec(count);
    MyFunctor func(myMin,myMax,count);
    func=std::for_each(vec.begin(),vec.end(),func);
    std::copy(vec.begin(),vec.end(),std::ostream_iterator<int>(std::cout," "));
}
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
24.05.2013, 16:06     Про рандом #7
Ilot, 20,21 строчки не понятны, num же не определен

Добавлено через 4 минуты
Croessmah, но последние несколько элементов часто единицы получаются
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,831
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 16:08     Про рандом #8
Людвиг Бодмер,
Цитата Сообщение от sergey1993 Посмотреть сообщение
чтобы все элементы массива в сумме давали 1000 и были положительными
условие задачи выполнено. А про равномерность тут ничего не сказано.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
24.05.2013, 16:16     Про рандом #9
Цитата Сообщение от Людвиг Бодмер Посмотреть сообщение
Ilot, 20,21 строчки не понятны, num же не определен
Зависит от компиятора. У меня (Visual c++ 6) переменные определенные в цикле видны и в блоке. Поэтому и при выводе:
C++
1
    for (num = 0; num < 10; num++)
Производиться только обнуление счетчика, а не его инициализация.
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
24.05.2013, 16:30     Про рандом #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Людвиг Бодмер,

условие задачи выполнено. А про равномерность тут ничего не сказано.

Не по теме:

Согласен)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 16:47     Про рандом
Еще ссылки по теме:

Рандом C++
C++ Рандом
C++ Рандом

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.05.2013, 16:47     Про рандом #11
Ilot, нельзя на это рассчитывать, так как после этой версии студии вышел не один стандарт языка. num выходит из области действия после завершения цикла, и обращение к ней вызовет ошибку компиляции на современных компиляторах. Про это и в книгах пишут, в частности о подобной ситуации упоминается в книге Дейтелов.

Добавлено через 6 минут
Вот так можно сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstdlib>
#include <ctime>
 
 
int main() {
   const int size = 10;
   int a[ size ] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
   
   std::srand( std::time( 0 ));
   
   for ( int i = 1; i < size; i++ ) {
      int r = std::rand() % 100;
      a[ i ] += r;
      a[ i - 1 ] -= r;
   }
   
   for ( int i = 0; i < size; i++ ) {
      std::cout << a[ i ] << ' ';
   }
   
   std::cout << std::endl;
}
В принципе получается равномерно.
Yandex
Объявления
24.05.2013, 16:47     Про рандом
Ответ Создать тему
Опции темы

Текущее время: 09:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru