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

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

03.04.2020, 13:52. Показов 4619. Ответов 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
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
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
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
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
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
22.04.2020, 08:58
Цитата Сообщение от m054 Посмотреть сообщение
C++
1
rand();
Что это за вызов rand(), одиноко стоящий в чистом поле в строке 9?
0
 Аватар для Annemesski
2684 / 1343 / 483
Регистрация: 08.11.2016
Сообщений: 3,731
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
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
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
2684 / 1343 / 483
Регистрация: 08.11.2016
Сообщений: 3,731
22.04.2020, 10:57
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это и какое это имеет отношение к данной задаче?
Прошляпил условие, а это генератор выдающий ноль с вероятностью 2/3 против 1/3 за единицу, то есть 0 в два раза чаще чем 1.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,305
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
2684 / 1343 / 483
Регистрация: 08.11.2016
Сообщений: 3,731
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,305
22.04.2020, 15:55
Цитата Сообщение от m054 Посмотреть сообщение
Но, если опустить условие о том, чтобы нулей было в 2 раза больше чем едениц, как сделать так, чтобы нулей было всегда больше, чем едениц?
Цитата Сообщение от daslex Посмотреть сообщение
Он не только опоздал, он неправильно сделал. Точнее, он решил не поставленную задачу.
Не поставленную?

Добавлено через 13 минут
Цитата Сообщение от Annemesski Посмотреть сообщение
alexu_007, опоздал )))
Там было про двумерный массив.
0
 Аватар для Annemesski
2684 / 1343 / 483
Регистрация: 08.11.2016
Сообщений: 3,731
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
Ответ Создать тему
Новые блоги и статьи
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru