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

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

03.04.2020, 13:52. Показов 4293. Ответов 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
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
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,267
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru