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

Рандомное заполнение - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.69
Mischanja
Всегда не хватает времени
 Аватар для Mischanja
117 / 117 / 7
Регистрация: 15.10.2009
Сообщений: 493
05.04.2011, 16:25     Рандомное заполнение #1
Здравствуйте уважаемые жители форума. По ходу выполнения некоего задания столкнулся с таким вопросом: есть двумерный массив который нужно заполнить рандомно нулями и единицами вот так по коду:
C++
1
2
3
4
5
6
7
for(i=0;i<M;i++)
        {     
                for(j=0;j<N;j++)
                {       
                   mas[i][j]=rand()%2;                
                }
        }
Суть проблемы в том, что мне нужно рандомное заполнение, но с условием что в строках массива должно быть не меньше n-количества единиц.

Буду признателен если кто-нибудь скажет как реализовать такое.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.04.2011, 16:43     Рандомное заполнение #2
Цитата Сообщение от Mischanja Посмотреть сообщение
Суть проблемы в том, что мне нужно рандомное заполнение, но с условием что в строках массива должно быть не меньше n-количества единиц.
Можно осуществить это по разному (хотя суть будет одна). Вы можете заранее инициализировать массив нулями, а первые n элементов единицами, затем просто перемешать содержимое. На мой взгляд это самое разумное
Далее Вы можете инициализировать массив единицами и в случайные места вбить необходимое количество нулей (или наоборот). И так далее, вариантов множество.
Mischanja
Всегда не хватает времени
 Аватар для Mischanja
117 / 117 / 7
Регистрация: 15.10.2009
Сообщений: 493
05.04.2011, 16:53  [ТС]     Рандомное заполнение #3
Цитата Сообщение от fasked Посмотреть сообщение
Вы можете заранее инициализировать массив нулями, а первые n элементов единицами, затем просто перемешать содержимое. На мой взгляд это самое разумное
а как это, перемешать, можно показать на примере?

Добавлено через 6 минут
мм, подумал а так вот можно? : заполняем первый ел. рандомом, проверяем сколько единиц, втой, опять проверяем, потом если сумма будет больше нужного мне кол. единиц то заполняем рандомом последний елемент с единицей
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.04.2011, 17:05     Рандомное заполнение #4
Цитата Сообщение от Mischanja Посмотреть сообщение
мм, подумал а так вот можно? : заполняем первый ел. рандомом, проверяем сколько единиц, втой, опять проверяем, потом если сумма будет больше нужного мне кол. единиц то заполняем рандомом последний елемент с единицей
Можно конечно, но время выполнения такого алгоритма соответственно тоже случайно.
Цитата Сообщение от Mischanja Посмотреть сообщение
а как это, перемешать, можно показать на примере?
В STL библиотеке есть алгоритм random_shuffle
Mischanja
Всегда не хватает времени
 Аватар для Mischanja
117 / 117 / 7
Регистрация: 15.10.2009
Сообщений: 493
05.04.2011, 17:25  [ТС]     Рандомное заполнение #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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
int main()
{
int N=4,M=5;
int sum;
int **mas;
int i ,j, k, d;
mas=new int *[M];
for (int i=0; i<M; i++)
 mas[i]=new int [N];
 
 
        for(i=0;i<M;i++)
        {
                for(j=0;j<N;j++)
                {
                        mas[i][j]=rand()%2;
                }
        }
 
 
        for(i=0;i<M;i++)
        {
                for(j=0;j<N;j++)
                {
                        cout<<mas[i][j];
                }      cout<<"\n";
        }
 
        for(i=0;i<M;i++)
        {       sum=0;
                for(j=0;j<N;j++)
                {
                        sum=sum+mas[i][j];
 
                }
                cout<<sum<<"\n";
                if(sum<2){     for(k=0;d<M;d++)
        {
                for(j=0;j<N;j++)
                {
                        mas[k][j]=rand()%2;
                }
        }       }
        }
 
        cin.sync();     cin.get();
    return 0;
}
но почему-то не меняет. Уважаемый fasked, может есть идея почему. если так посмотреть по оно долно менять рандомом пока сумма не будет больше 2-х а потом перестать, по на деле не так
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
05.04.2011, 17:40     Рандомное заполнение #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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <locale.h>
#include <conio.h>
#include<ctime>
const int M=5;
using namespace std;
int main ()
{
     srand(time(0));
    setlocale(LC_ALL, "Russian");
    int n,s,kol=0;
    cout << "\nВведите n ";
    cin>>n;
    int mas[M][M];
        for(int i=0;i<M;i++)           
                for(int j=0;j<M;j++)
                {       
                   mas[i][j]=rand()%2;
                   if (mas[i][j]==1)
                   {kol++;}
                 cout.width(16); 
                cout << mas[i][j];
                   
                }
                cout<<endl;
                cout << "************************************************"<<endl;
                cout<<endl;
                if (kol<n)
                {
                    s=n-kol;
                    int kol1=0;
                for(int i=0;i<M;i++)           
                for(int j=0;j<M;j++)
                {   
                    if (mas[i][j]==0)
                    {
                    mas[i][j]=1;
                    kol1++;
                    if (kol1==s)
                    {goto xxx;}
                    }
                }
 
                    
 
                    
                }
 
xxx: for(int i=0;i<M;i++)           
                for(int j=0;j<M;j++)
                {cout.width(16);
                cout << mas[i][j];}
getche();
    return 0;
 
}
работает вроде корректно, еще бы от goto избавиться...
Mischanja
Всегда не хватает времени
 Аватар для Mischanja
117 / 117 / 7
Регистрация: 15.10.2009
Сообщений: 493
05.04.2011, 17:43  [ТС]     Рандомное заполнение #7
Цитата Сообщение от Svid Посмотреть сообщение

работает вроде корректно, еще бы от goto избавиться...
не так страшен GoTo как его рисуют =)
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
05.04.2011, 17:45     Рандомное заполнение #8
В принципе, просто на самом деле от него избавиться, заменить его на
C++
1
2
i=M;
j=M;
Mischanja
Всегда не хватает времени
 Аватар для Mischanja
117 / 117 / 7
Регистрация: 15.10.2009
Сообщений: 493
05.04.2011, 17:50  [ТС]     Рандомное заполнение #9
у меня почему-то не выполняет условие чтобы единиц было больше н по этой программе.
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
05.04.2011, 18:11     Рандомное заполнение #10
Да, вообще не понятно как меняет...
Сейчас думать буду.

Добавлено через 5 минут
На самом деле, Вы меня с толку сбили...
например, вводим n 25 и он заполняет все 1.
У меня условия, чтобы не меньше n, можно сделать больше:
C++
1
2
3
if (kol<=n)
                                {
                                        s=(n-kol)+1;
попробуйте - все работает.
Mischanja
Всегда не хватает времени
 Аватар для Mischanja
117 / 117 / 7
Регистрация: 15.10.2009
Сообщений: 493
05.04.2011, 18:19  [ТС]     Рандомное заполнение #11
все элементы не меняет и они остаются на своих местах. если задать н=3 и тд то условие что единиц в строке должно быть больше за н все ровно не срабатывает
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
05.04.2011, 20:26     Рандомное заполнение #12
Все, понял проблему:
у меня общее количество 1 в массиве, без привязки к строкам, и если оно меньше n он меняет первый попавшийся 0 на 1.
Для количества единиц в строке надо по другому реализовывать, но принцип тот же (считается количество единиц, сравнивается с n если меньше - запускается цикл меняющий нули на единицы).
Позже напишу, сейчас убегаю.

Добавлено через 1 час 54 минуты
Вот теперь по строчкам.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <locale.h>
#include <conio.h>
#include<ctime>
const int M=5;
using namespace std;
int main ()
{
         srand(time(0));
        setlocale(LC_ALL, "Russian");
        int n,s,kol=0;
        cout << "\nВведите n ";
        cin>>n;
        int mas[M][M];
        int mas1[M]={0};
                for(int i=0;i<M;i++)           
                for(int j=0;j<M;j++)
                {
                   mas[i][j]=rand()%2;
                  if (mas[i][j]==1)
                                   {mas1[i]+=1;} 
                   cout.width(16); 
                   cout << mas[i][j];
                                   
                }
cout<<endl;
cout << "************************************************"<<endl;
for(int i=0;i<M;i++)           
                                {
                                cout << mas1[i];}
cout<<endl;
for(int i=0;i<M;i++)           
                for(int j=0;j<M;j++)
                {
                    if (mas1[i]<n)
                    {
                        if (mas[i][j]==0)
                        { 
                            mas[i][j]=1;
                            mas1[i]+=1;
                        }
                        
                    }
                        cout.width(16); 
                   cout << mas[i][j];
                }
    cout << "************************************************"<<endl;
for(int i=0;i<M;i++)           
                                {
                                cout << mas1[i];}                           
 
getche();
        return 0;
 
}
Только мусор лишний надо убрать.
Я правильно в этот раз понял задание: если в строчке массива количество единиц меньше n - нули в этой строчке меняем на единицы до нужного. Соответственно, обмен нулей на единицы в этой строчке никак не коррелирует с остальными строчками??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2011, 20:28     Рандомное заполнение
Еще ссылки по теме:

Выполнить рандомное заполнение матриц C++
C++ Рандомное число
C++ Рандомное заполнение массива так, чтобы числа в нем не повторялись

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.04.2011, 20:28     Рандомное заполнение #13
Я не читал код, который был здесь приведен, но старался следовать ходу рассуждений.
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
#include <iostream>
using std::cout;
using std::endl;
 
#include <ctime>
 
int main()
{
    const int dataSize = 25;
    int data[dataSize] = { 0 };
    int minNumberOfOnes = 10;
 
    srand((unsigned)time(NULL));
    for (int currentNumberOfOnes = 0; currentNumberOfOnes <= minNumberOfOnes; ) {
        for (int i = 0; i < dataSize; ++i) {
            if (data[i] == 0) 
                currentNumberOfOnes += (data[i] = rand() % 2);
        }
    }
 
    for (int i = 0; i < dataSize; ++i)
        cout << data[i] << ' ';
 
    cout << endl;
    return 0;
}
Здесь количество едениц всегда будет больше или равно minNumberOfOnes, в данном случае 10.
Yandex
Объявления
05.04.2011, 20:28     Рандомное заполнение
Ответ Создать тему
Опции темы

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