Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82

Замолнить матрицу рандомно так чтобы нулей было в 2 раза больше чем единиц

03.04.2020, 13:52. Показов 4333. Ответов 49

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Подскажите, как заполнить двумерный массив 8х8 случайными числами от 0 до 1, так, чтобы нулей было в 2 раза больше едениц?
Как по мне, так эта задача не имеет решения, т.к.:
В данном массиве 64 ячейки.
Максимальное количество едениц - 21, тогда нулей - 42, общее количество занятых ячеек - 63. Одна ячейка будет пустой. В противном случае будет переполнение массива.

Но, если опустить условие о том, чтобы нулей было в 2 раза больше чем едениц, как сделать так, чтобы нулей было всегда больше, чем едениц?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2020, 13:52
Ответы с готовыми решениями:

Заполнить массив значениями 0 и 1 случайным образом, но чтобы нулей было в два раза больше, чем единиц
Здравствуйте! Не могу решить задачу, есть ли идеи как это можно сделать? Заранее благодарю! Заполнить одномерный массив на 30...

Заполнить массив случайным образом 0 и 1 так, чтобы кол-во единиц было больше количества нулей
Добрый вечер, ребят. Помогите, пожалуйста, решить задачу на C#. Буду очень благодарен! Задача: Заполните массив случайным образом...

Как сделать так чтобы нельзя было вводить больше чем число текущего года?
int y = DateTime.Now.Year; if (richTextBox3.Text.Length == 1 && Convert.ToInt16(richTextBox3.Text) > 9) { ...

49
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.04.2020, 14:02
m054, возможно массив не под завязку заполнять нужно
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
03.04.2020, 19:06  [ТС]
Возможно, но, как тогда сделать так, чтобы массив был гарантированно заполнен нулями в большем количестве?
я сделал так, хотя это не решение, а, с большой натяжкой, читерство:
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
#include <iostream>
#include <time.h>
using namespace std;
 
int main() {
    setlocale(0, "");
    srand(time(0));
    const int row = 8, col = 8;
    float arr[row][col] = {}, count_0=0, count_1 = 0;
    
    for (int i = 0; i < row-1; i++) //заполнил массив и посчитал нули и еденицы
    {
        for (int j = 0; j < col-5; j++)
        {
            arr[i][j] = rand() % 1+1;
        }
    }
    for (int i = 0; i < row ; i++)//вывод массива на экран
    {
        for (int j = 0; j < col; j++)
        {
            cout << arr[i][j];
            if (arr[i][j] == 0)
                count_0++; //считаем нули в массиве
            else count_1++;//считаем еденицы в массиве
        }
        cout << "\n";
    }
    cout << endl;
 
    cout << "Количество нулей: " << count_0<<" ";
    cout << "Количество едениц: " << count_1<<" ";
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 00:20
Заполнить массив сначала нулями, потом единицами и сделать c массивом shuffle.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.04.2020, 01:28
Цитата Сообщение от m054 Посмотреть сообщение
Подскажите, как заполнить двумерный массив 8х8 случайными числами от 0 до 1, так, чтобы нулей было в 2 раза больше единиц?
объявить массив типа double и заполнить числами (например) 10 нулей, 5 единиц и 49 чисел 0.1, 0.2, 0.3 .... 0.9
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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    srand((unsigned)time(0));
    const int n=8;
    double a[n][n];
    int nul, one;
    
    do
    {
    nul=one=0;    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
        a[i][j]=0.1*(rand()%11);
        if(a[i][j]==0.) nul++;
        else if (a[i][j]==1.) one++;
        }
    }
    
    if(one!=0 && nul==2*one)
    {    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)            
            cout << setw(3) << a[i][j] << "  ";
        cout << "\n";    
        }
    cout << "nul: "  << nul << "\n";
    cout << "one: "  << one << "\n";     
    }
    }
    while(one==0 || nul!=2*one);    
 
system("pause");
return 0;
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 01:31
Зачем что-то придумывать, если очевидно, что условие неточное?
m054, вы начали делать в лоб, всё, что вам осталось — перемешать массив. Это нормальный подход.

Если массив чистый, а не на указателях, то можно вот так (в этом коде можно указывать разное число строк и колонок массиву)

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
#include <iostream>
#include <time.h>
#include <algorithm>
 
using namespace std;
 
int main() {
    setlocale(0, "");
    srand(time(0));
    const int row = 8, col = 11;
    float arr[row][col] = {}, count_0=0, count_1 = 0;
 
    srand(time(0));
 
    int count = 0;
    for (int i=0; i<row; i++){   //заполняем 
        for (int j=0; j<col; j++){
            arr[i][j] = (count++ < row * col / 3);    
        }
    }
    random_shuffle(arr[0], arr[0] + row * col); //перемешиваем массив
 
 
    for (const auto &i:arr){
        for (const auto &j:i){
            cout << j << ' ';
            if (j) count_1++;
            else count_0++;
        }
        cout << '\n';
    }
 
    cout << '\n';
    cout << "all: " << row * col << '\n';
    cout << "1:   " << count_1 << '\n';
    cout << "0:   " << count_0 << '\n';
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.04.2020, 01:35
Цитата Сообщение от daslex Посмотреть сообщение
Зачем что-то придумывать, если очевидно, что условие неточное?
условие точное, решение под него приведено в сообщении №5
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 02:07
Да сделать два нуля, одну единицу, остальное запихать хламом:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main(){
    srand(time(0));
    const int row=8, col=8;
    double arr[row][col] = {};
 
    for (int i=0; i<row; i++){
        for (int j=0; j<col; j++){
            arr[i][j] =  0.1 * (rand() % 11) + 0.001;
            if (arr[i][j] >= 1) i = 0.9;
        }
    }
 
    arr[0][0] = 0, arr[0][1] = 0, arr[0][2] = 1;
    swap(arr[0][0], arr[0][rand()%(row*col)]);
    swap(arr[0][1], arr[0][rand()%(row*col)]);
    swap(arr[0][2], arr[0][rand()%(row*col)]);
 
    for (const auto &i:arr){
        for (const auto &j:i){
            cout << j << '\t';
        }
        cout << '\n';
    }
 
    cout << "count_1: " << 1 << '\n';
    cout << "count_0: " << 2 << '\n';
}
Прям точно по условию. Всё ОК.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.04.2020, 02:14
не слишком большим может быть индекс ?
Цитата Сообщение от daslex Посмотреть сообщение
rand()%(row*col)
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 02:16
нет.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.04.2020, 02:18
Цитата Сообщение от daslex Посмотреть сообщение
нет
какие это значения
Цитата Сообщение от daslex Посмотреть сообщение
rand()%(row*col)
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 02:21
Это значение какой-то случайной ячейки двумерного статически создаваемого массива.
arr[row][col] то же, что arr[row * col].
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.04.2020, 02:28
daslex, я вот что спрашиваю - такой элемент: arr[0][63] в массиве есть ? у Вас получается есть
Цитата Сообщение от daslex Посмотреть сообщение
swap(arr[0][0], arr[0][rand()%(row*col)]);
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 02:29
Потому что он в массиве [8][8] есть.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.04.2020, 02:32
Цитата Сообщение от daslex Посмотреть сообщение
Потому что он в массиве [8][8] есть
нет, элемента arr[0][63] в массиве нет. максимальный индекс: 7
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 02:38
Я непонятно пишу?
Для массивов на стеке arr[row][col] то же, что arr[row * col]
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.04.2020, 02:41
daslex, у Вас написано не так:
Цитата Сообщение от daslex Посмотреть сообщение
arr[row * col]
а примерно так:
arr[0][row * col]

неужели это не видно ? строка 20
Цитата Сообщение от daslex Посмотреть сообщение
swap(arr[0][0], arr[0][rand()%(row*col)]);
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.04.2020, 03:40
Не смогу я объяснить, пусть кто может объясняет. В последний раз пробую.

То, что у [8][8] есть [0][63] — это факт. Если быть точнее, чем я был, то там что-то вроде этого
arr[row][col] ===(*arr)[row * col] === arr[0][row * col]

Суть в том, что имя двумерного массива на стеке можно использовать как указатель на одномерный массив. А сам по себе двумерный массив в памяти расположен как одномерный массив.

Можно ещё сказать, что двумерный массив — это массив, хранящий в себе только один массив, при этом тот хранимый в массиве массив представляет собой строку всех значений этого двумерного массива. Вот тот индекс [0] — это индекс той первой и единственной строки, а row*col — это число значений там.

Добавлено через 21 минуту
Работает это так:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main(){
    srand(time(0));
    const int row=3, col=3;
    int arr[row][col] = {};
 
    arr[0][3] = 1;
    arr[0][4] = 2;
    arr[0][5] = 3;
 
 
    for (const auto &i:arr){
        for (const auto &j:i){
            cout << j << ' ';
        }
        cout << '\n';
    }
 
    /*
    0  0  0
    1  2  3  //запись была через [0][порядковый_номер_элемента]
    0  0  0
    */
 
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
04.04.2020, 04:29
Цитата Сообщение от m054 Посмотреть сообщение
Но, если опустить условие о том, чтобы нулей было в 2 раза больше чем едениц, как сделать так, чтобы нулей было всегда больше, чем едениц?
Я уже показывал, как делается генерация "в один проход" случайной последовательности с одинаковым количеством нулей и единиц: Поровну заполнить массив числами в диапазоне 0-1

Для того, чтобы таким способом получить случайную последовательность с любым заранее заданным количеством нулей и единиц, достаточно просто назначить соответствующие начальные значения n0 и n1.

Например, для 43 нулей и 21 единиц

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <algorithm>
#include <iostream>
#include <iterator>
 
int main()
{
  unsigned array[64];
 
  std::generate(std::begin(array), std::end(array), 
    [n0 = 43, n1 = 21]() mutable
    { 
       return rand() % (n0 + n1) < n0 ? (--n0, 0) : (--n1, 1); 
    }
  );
 
  std::copy(std::begin(array), std::end(array), std::ostream_iterator<int>(std::cout, ""));
  std::cout << std::endl;
}
Или для случайного количества нулей, большего, чем количество единиц

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <algorithm>
#include <iostream>
#include <iterator>
 
int main()
{
  unsigned array[64];
  
  unsigned n0 = 32 + 1 + rand() % 32;
  unsigned n1 = 64 - n0;
 
  std::generate(std::begin(array), std::end(array), 
    [&]
    { 
       return rand() % (n0 + n1) < n0 ? (--n0, 0) : (--n1, 1); 
    }
  );
 
  std::copy(std::begin(array), std::end(array), std::ostream_iterator<int>(std::cout, ""));
  std::cout << std::endl;
}
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,274
04.04.2020, 07:57
Блин. Заполните весь массив нулями и добавьте рэндомно 21 единицу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2020, 07:57
Помогаю со студенческими работами здесь

Найти и вывести номер строки в которой единиц больше чем нулей
Дан двумерный массив m на n, там токо 0 и 1. Надо найти и вывести номер строки, в которой единиц больше чем нулей. Заранее спасибо.

Из массива В удалить числа в двоичном представлении которых единиц больше, чем нулей
Переписать положительные числа из матрицы целых чисел А в массив В. Из массива В удалить числа в двоичном представлении которых единиц...

Подсчитать и вывести на экран количество N и номера таких столбцов, в которых нулей больше чем единиц
Матрицу М(12, 10) заполнить нулями и единицами случайным образом. Подсчитать и вывести на экран количество N и номера таких столбцов, в...

Сгенерируйте серию случайных чисел из 0, 1, 2 так, чтобы количество двоек было равно количеству единиц
Сгенерируйте серию случайных чисел из 0, 1, 2 так, чтобы количество двоек было равно количеству единиц.

сделать так чтобы a было больше b
Private Sub CommandButton1_Click() If Val(s) = Val(TextBox1) Then n = n + 1 k = k + 1 Label12.Caption = &quot;&quot; Label13.Caption = &quot;&quot; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru