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

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

03.04.2020, 13:52. Показов 4323. Ответов 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
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
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
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
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
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
22.04.2020, 08:58
Цитата Сообщение от m054 Посмотреть сообщение
C++
1
rand();
Что это за вызов rand(), одиноко стоящий в чистом поле в строке 9?
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,687
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
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
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
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,687
22.04.2020, 10:57
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это и какое это имеет отношение к данной задаче?
Прошляпил условие, а это генератор выдающий ноль с вероятностью 2/3 против 1/3 за единицу, то есть 0 в два раза чаще чем 1.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
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
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,687
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
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
22.04.2020, 15:55
Цитата Сообщение от m054 Посмотреть сообщение
Но, если опустить условие о том, чтобы нулей было в 2 раза больше чем едениц, как сделать так, чтобы нулей было всегда больше, чем едениц?
Цитата Сообщение от daslex Посмотреть сообщение
Он не только опоздал, он неправильно сделал. Точнее, он решил не поставленную задачу.
Не поставленную?

Добавлено через 13 минут
Цитата Сообщение от Annemesski Посмотреть сообщение
alexu_007, опоздал )))
Там было про двумерный массив.
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,687
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
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru