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

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

03.04.2020, 13:52. Показов 4656. Ответов 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Эксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
04.04.2020, 08:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Блин. Заполните весь массив нулями и добавьте рэндомно 21 единицу.
Гениально! Вы в качестве решения задачи предложили вольный пересказ условия задачи.

Вопрос фактически в том и состоит, как правильно "добавить рэндомно 21 единицу". Как вы предлагаете это сделать?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.04.2020, 09:08
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Как вы предлагаете это сделать?
1. Сгенерировать индекс от 0 до 63.
2. Проверить есть ли 1 по указанному индексу.
а. Если есть то возвращаемся к шагу 1.
б. Если нет то увеличиваем счетчик единиц,
пишем единицу в сгенерерированную позицию,
3. Если счетчик равен 21 Стоп, в противном случае возвращаемся к шагу 1.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
04.04.2020, 09:18
Цитата Сообщение от _stanislav Посмотреть сообщение
1. Сгенерировать индекс от 0 до 63.
2. Проверить есть ли 1 по указанному индексу.
а. Если есть то возвращаемся к шагу 1.
б. Если нет то увеличиваем счетчик единиц,
пишем единицу в сгенерерированную позицию,
3. Если счетчик равен 21 Стоп, в противном случае возвращаемся к шагу 1.
Прекрасно. Так вот это тема как раз посвящена тому, чтобы не заниматься подобным верчением на месте "а. Если есть то возвращаемся к шагу 1."

Справедливости ради надо заметить, что такой алгоритм вполне применим и даже является лучшим для генерации маленького количества единиц. А вот использовать такой алгоритм для генерации относительно большого количества единиц - это уже профанация. Где проходит водораздел между "маленьким" и "большим" - отдельная теория.
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
22.04.2020, 08:50  [ТС]
Коллеги, спасибо за Ваши рекомендации, решил следующим образом (ответ, как обычно, опять лежал на поверхности):
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
#include <iostream>
#include <time.h>
using namespace std;
 
int main() {
    setlocale(0, "");
    srand(time(0));
 
    rand();
    //задаем размер массива
    const int n = 8;
    //объявляю массив и заполняю его нулями
    int arr[n][n] = { {} };
    //создать переменную в которой будет зашита логика чтобы нулей было больше едениц в 2 раза
    int count = (n * n) / 3;//делим на 3, т.к. по сути общее количество элементов массива (64) занимается единицами только на 3-ю часть (21 а не 32) т.к. в 2 раза больше 0-й - это 42
    cout << "count - " << count << endl;
 
                            //заполнить массив рандомными единицами, т.к. нули у нас уже есть
    for (int x = 0; x < count; )//пока меньше нужного количества (в нашем случае единиц) заполняем единицами
    {
        int i = rand() % n;//единицы в рандомном порядке в строках
        int j = rand() % n;//единицы в рандомном порядке в столбцах
        if (arr[i][j] == 0)//если эл-ты массива равны нулю, то меняем их на единицы (пока не достигнем числа единиц содержащегося в count (21 в нашем случае)
        {
            arr[i][j] = 1;
            x++;           
        }
    }
    //вывод массива на экран
    int count_0=0, count_1=0,i,j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            cout << arr[i][j] << " ";
            if (arr[i][j] == 0)
                count_0++;
            if (arr[i][j] == 1)
                count_1++;
        }
        cout << endl;
    }
        cout <<"Нулей - "<< count_0 << endl;
        cout <<"Едениц - "<< count_1 << endl;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
22.04.2020, 08:58
Цитата Сообщение от m054 Посмотреть сообщение
C++
1
rand();
Что это за вызов rand(), одиноко стоящий в чистом поле в строке 9?
0
 Аватар для Annemesski
2686 / 1344 / 484
Регистрация: 08.11.2016
Сообщений: 3,733
22.04.2020, 10:09
Народ, вы чего?
C++
1
2
3
4
5
6
for (int i = 0; i < n; i++)
{
    unsigned rnd = rand() % 3;
    rnd > 1 ? rnd = 0 : false;
    arr[i] = rnd;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
22.04.2020, 10:43
Цитата Сообщение от Annemesski Посмотреть сообщение
Народ, вы чего?
C++
1
2
3
4
5
6
for (int i = 0; i < n; i++)
{
    unsigned rnd = rand() % 3;
    rnd > 1 ? rnd = 0 : false;
    arr[i] = rnd;
}
Что это и какое это имеет отношение к данной задаче?
0
 Аватар для Annemesski
2686 / 1344 / 484
Регистрация: 08.11.2016
Сообщений: 3,733
22.04.2020, 10:57
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это и какое это имеет отношение к данной задаче?
Прошляпил условие, а это генератор выдающий ноль с вероятностью 2/3 против 1/3 за единицу, то есть 0 в два раза чаще чем 1.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
22.04.2020, 11:01
Нулей будет (приблизительно) в 2 раза больше, чем единиц:

C
1
2
3
4
5
6
7
for(int i = 0; i < i_max; i++)
    for(int j = 0; j < j_max; j++)
    {
        int x = rand()%3;
        if(x == 2) x = 0;
        arr[i][j] = x;
    }
0
 Аватар для Annemesski
2686 / 1344 / 484
Регистрация: 08.11.2016
Сообщений: 3,733
22.04.2020, 11:03
alexu_007, опоздал )))
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
22.04.2020, 11:07
Он не только опоздал, он неправильно сделал. Точнее, он решил не поставленную задачу.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
22.04.2020, 11:38
Цитата Сообщение от m054 Посмотреть сообщение
чтобы нулей было в 2 раза больше едениц
Цитата Сообщение от m054 Посмотреть сообщение
Коллеги, спасибо за Ваши рекомендации, решил следующим образом
Нулей - 43
Едениц - 21
значит рекомендации прошли мимо. 21*2=42 (а не 43). как решается эта задача показал Вам выше.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
22.04.2020, 15:55
Цитата Сообщение от m054 Посмотреть сообщение
Но, если опустить условие о том, чтобы нулей было в 2 раза больше чем едениц, как сделать так, чтобы нулей было всегда больше, чем едениц?
Цитата Сообщение от daslex Посмотреть сообщение
Он не только опоздал, он неправильно сделал. Точнее, он решил не поставленную задачу.
Не поставленную?

Добавлено через 13 минут
Цитата Сообщение от Annemesski Посмотреть сообщение
alexu_007, опоздал )))
Там было про двумерный массив.
0
 Аватар для Annemesski
2686 / 1344 / 484
Регистрация: 08.11.2016
Сообщений: 3,733
22.04.2020, 16:26
Цитата Сообщение от alexu_007 Посмотреть сообщение
Там было про двумерный массив.
а ну да... есть разница )))
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
22.04.2020, 17:33
Задача не только о том, что массив двумерный, но и о том, что нулей должно оказаться в нём ровно в два раза больше, чем единиц. Не приблизительно, а именно что ровно. Но условие задачи составлено недостаточно точно, поэтому возникает проблема, о которой ТС спрашивал: при условии, что массив [8][8], невозможно записать в массив нулей ровно в два раза больше, чем единиц. Идея задачи в том, что для любого сгенерированного массива [8][8] количество нулей одинаково с количеством нулей, и количество единиц всегда одинаково с количеством единиц каждого, а количество нулей при этом не менее, чем в два раза превышает число единиц, т. е. что 1/3 массива — это единицы, а 2/3 массива — нули.
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
22.04.2020, 20:12
Цитата Сообщение от daslex Посмотреть сообщение
в нём ровно в два раза больше,
про ровно в задании ни слова.
Так что:
C++
1
a[i][j] = (rand() % 3 > 1) ? 1 : 0;
вполне соответствует поставленной задаче.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
22.04.2020, 20:21
В два раза больше — это ровно в два раза больше, это не меньше, чем в два раза больше, и не больше, чем в два раза больше. Не вижу смысла и не буду вступать в диалог со всеми, кто этого не понимает.
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
22.04.2020, 20:25
Ещё немного о задании: 64 не делится на 3. значит нулей не может быть ровно в два раза больше единиц. Что ещё мог иметь в виду автор задачи? Например вероятность выпадения 0 в два раза больше вероятности выпадения 1.

Или ещё вариант.:
Кликните здесь для просмотра всего текста
Т.к.
случайными числами от 0 до 1, так, чтобы нулей было в 2 раза больше единиц?
то заполняем массив числами от 0.1 до 0.9, а потом ставим два нуля и одну единицу в разные позиции
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
22.04.2020, 20:42
Предложенный способ с действительными числами был уже выбран и предложен Yetti, только это филькина грамота, хотя само решение в таком виде действительно и справедливо должно считаться решением поставленной задачи, в отличие от предложенной генерации a[i][j] = (rand() % 3 > 1) ? 1 : 0;. Так составлено условие, что решение с действительными числами отвечает запросу. А филькина грамота, потому что так можно в 1 ячейку запихнуть единицу, в 2 другие по нулю, а в остальные любые другие числа, после чего ходить с поднятой головой и гордо считать себя программистом: в задании же не сказано, что массив состоит только из нулей и единиц.
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
22.04.2020, 20:43
Цитата Сообщение от daslex Посмотреть сообщение
а количество нулей при этом не менее, чем в два раза превышает число единиц,
вот это как раз пример не верного следствия. почему соотношение 24/40 хуже чем 10/54 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2020, 20:43

Найти и вывести номер строки в которой единиц больше чем нулей
Дан двумерный массив 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; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru