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

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

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

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

Но, если опустить условие о том, чтобы нулей было в 2 раза больше чем едениц, как сделать так, чтобы нулей было всегда больше, чем едениц?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2020, 13:52
Ответы с готовыми решениями:

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

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

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

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

49
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
04.04.2020, 08:05 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Блин. Заполните весь массив нулями и добавьте рэндомно 21 единицу.
Гениально! Вы в качестве решения задачи предложили вольный пересказ условия задачи.

Вопрос фактически в том и состоит, как правильно "добавить рэндомно 21 единицу". Как вы предлагаете это сделать?
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
04.04.2020, 09:08 22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Как вы предлагаете это сделать?
1. Сгенерировать индекс от 0 до 63.
2. Проверить есть ли 1 по указанному индексу.
а. Если есть то возвращаемся к шагу 1.
б. Если нет то увеличиваем счетчик единиц,
пишем единицу в сгенерерированную позицию,
3. Если счетчик равен 21 Стоп, в противном случае возвращаемся к шагу 1.
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
04.04.2020, 09:18 23
Цитата Сообщение от _stanislav Посмотреть сообщение
1. Сгенерировать индекс от 0 до 63.
2. Проверить есть ли 1 по указанному индексу.
а. Если есть то возвращаемся к шагу 1.
б. Если нет то увеличиваем счетчик единиц,
пишем единицу в сгенерерированную позицию,
3. Если счетчик равен 21 Стоп, в противном случае возвращаемся к шагу 1.
Прекрасно. Так вот это тема как раз посвящена тому, чтобы не заниматься подобным верчением на месте "а. Если есть то возвращаемся к шагу 1."

Справедливости ради надо заметить, что такой алгоритм вполне применим и даже является лучшим для генерации маленького количества единиц. А вот использовать такой алгоритм для генерации относительно большого количества единиц - это уже профанация. Где проходит водораздел между "маленьким" и "большим" - отдельная теория.
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
22.04.2020, 08:50  [ТС] 24
Коллеги, спасибо за Ваши рекомендации, решил следующим образом (ответ, как обычно, опять лежал на поверхности):
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Эксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
22.04.2020, 08:58 25
Цитата Сообщение от m054 Посмотреть сообщение
C++
1
rand();
Что это за вызов rand(), одиноко стоящий в чистом поле в строке 9?
0
2524 / 1244 / 459
Регистрация: 08.11.2016
Сообщений: 3,418
22.04.2020, 10:09 26
Народ, вы чего?
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Эксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
22.04.2020, 10:43 27
Цитата Сообщение от 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
2524 / 1244 / 459
Регистрация: 08.11.2016
Сообщений: 3,418
22.04.2020, 10:57 28
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это и какое это имеет отношение к данной задаче?
Прошляпил условие, а это генератор выдающий ноль с вероятностью 2/3 против 1/3 за единицу, то есть 0 в два раза чаще чем 1.
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,965
22.04.2020, 11:01 29
Нулей будет (приблизительно) в 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
2524 / 1244 / 459
Регистрация: 08.11.2016
Сообщений: 3,418
22.04.2020, 11:03 30
alexu_007, опоздал )))
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
22.04.2020, 11:07 31
Он не только опоздал, он неправильно сделал. Точнее, он решил не поставленную задачу.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
22.04.2020, 11:38 32
Цитата Сообщение от m054 Посмотреть сообщение
чтобы нулей было в 2 раза больше едениц
Цитата Сообщение от m054 Посмотреть сообщение
Коллеги, спасибо за Ваши рекомендации, решил следующим образом
Нулей - 43
Едениц - 21
значит рекомендации прошли мимо. 21*2=42 (а не 43). как решается эта задача показал Вам выше.
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,965
22.04.2020, 15:55 33
Цитата Сообщение от m054 Посмотреть сообщение
Но, если опустить условие о том, чтобы нулей было в 2 раза больше чем едениц, как сделать так, чтобы нулей было всегда больше, чем едениц?
Цитата Сообщение от daslex Посмотреть сообщение
Он не только опоздал, он неправильно сделал. Точнее, он решил не поставленную задачу.
Не поставленную?

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

Или ещё вариант.:
Кликните здесь для просмотра всего текста
Т.к.
случайными числами от 0 до 1, так, чтобы нулей было в 2 раза больше единиц?
то заполняем массив числами от 0.1 до 0.9, а потом ставим два нуля и одну единицу в разные позиции
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
22.04.2020, 20:42 39
Предложенный способ с действительными числами был уже выбран и предложен Yetti, только это филькина грамота, хотя само решение в таком виде действительно и справедливо должно считаться решением поставленной задачи, в отличие от предложенной генерации a[i][j] = (rand() % 3 > 1) ? 1 : 0;. Так составлено условие, что решение с действительными числами отвечает запросу. А филькина грамота, потому что так можно в 1 ячейку запихнуть единицу, в 2 другие по нулю, а в остальные любые другие числа, после чего ходить с поднятой головой и гордо считать себя программистом: в задании же не сказано, что массив состоит только из нулей и единиц.
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
22.04.2020, 20:43 40
Цитата Сообщение от daslex Посмотреть сообщение
а количество нулей при этом не менее, чем в два раза превышает число единиц,
вот это как раз пример не верного следствия. почему соотношение 24/40 хуже чем 10/54 ?
0
22.04.2020, 20:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2020, 20:43
Помогаю со студенческими работами здесь

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

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

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

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

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

Сгенерируйте серию случайных чисел из 0, 1, 2 так, чтобы количество двоек было равно количеству нулей
Здравствуйте, помогите пожалуйста решить задачу. Очень нужно. Сгенерируйте серию случайных чисел...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru