0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
1

Заполнить массив случайным образом 0 и 1 так, чтобы кол-во единиц было больше количества нулей

23.06.2016, 18:17. Показов 8513. Ответов 24
Метки нет (Все метки)

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

Задача: Заполните массив случайным образом нулями и единицами так, чтобы количество единиц было больше количества нулей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2016, 18:17
Ответы с готовыми решениями:

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

Заполнить одномерный массив так, чтобы все его элементы были различны и выбраны случайным образом
В Delphi создать консольные приложения (File-New-Console Application) для решения следующих задач....

Заполнить двумерный массив расположив заданное количество единиц случайным образом
Ребята , nомогите додумать , есть двумерный динамический массив , заnолняется рандомно цыфрами 0 и...

Заполнить массив так, чтобы в каждой строке и каждом столбце не было повторяющихся элементов
Есть матрица NxN (N<=10). Требуется заполнить массив так, чтобы в каждой строке и каждом столбце не...

24
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
23.06.2016, 19:20 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        static void Main(string[] args)
        {
            int m = 10;
            Random rnd = new Random();
            int[] arr = new int[m];
 
            while (arr.Count(r => r == 1) < arr.Count() / 2)
                for (int i = 0; i < arr.Length; i++)
                    arr[i] = rnd.Next(0, 2);
 
            foreach (int i in arr)
                Console.Write(string.Format("{0,2} ", i));
 
            Console.WriteLine();
            Console.ReadKey();
        }
Добавлено через 4 минуты
С выводом количества

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        static void Main(string[] args)
        {
            int m = 100;
            Random rnd = new Random();
            int[] arr = new int[m];
 
            while (arr.Count(r => r == 1) < arr.Count() / 2)
                for (int i = 0; i < arr.Length; i++)
                    arr[i] = rnd.Next(0, 2);
 
            foreach (int i in arr)
                Console.Write(string.Format("{0,2} ", i));
 
            Console.WriteLine();
            Console.WriteLine(string.Format("Нулей: {0}, единиц: {1}",
                arr.Count(r => r == 0), arr.Count(r => r == 1)));
            Console.ReadKey();
        }


Добавлено через 15 минут
Упустил момент, что может быть равно...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            int m = 100;
            Random rnd = new Random();
            int[] arr = new int[m];
 
            for (; arr.Count(r => r == 1) <= arr.Count() / 2;)
                for (int i = 0; i < arr.Length; i++)
                    arr[i] = rnd.Next(0, 2);
 
            foreach (int i in arr)
                Console.Write(string.Format("{0,2} ", i));
 
            Console.WriteLine();
            Console.WriteLine(string.Format("Нулей: {0}, единиц: {1}",
                arr.Count(r => r == 0), arr.Count(r => r == 1)));
            Console.ReadKey();
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
23.06.2016, 19:49 3
как вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Random rnd=new Random();
    int len=1000;
    double OnesMax=0.7;
    int OnesCount=rnd.Next(len/2+1,(int)(len*OnesMax));
    var arr=new int[len];
    for (int i = 0; i < OnesCount; i++)
    {
        int index=rnd.Next(0,len);
        while(arr[index]==1)
           index=rnd.Next(0,len);
        arr[index]=1;
    }
    Console.WriteLine ("Нулей:{0}",arr.Count(x=>x==0));
    Console.WriteLine ("Единиц:{0}",arr.Count(x=>x==1));
    Console.WriteLine ("Массив:");
    arr.ToList().ForEach(x=>Console.Write("{0} ",x));
1
3091 / 2233 / 641
Регистрация: 02.08.2011
Сообщений: 6,125
23.06.2016, 20:15 4
Как вариант:
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
46
47
48
49
50
51
52
53
54
55
56
static IEnumerable<int> GenerateOnesDominatedMassive(int length)
        {
            if (length <= 0)
                throw new ArgumentException("Length must be a positive number.");
 
            var rand = new Random();
 
            var zerosIndexes = new List<int>();
            var onesIndexes = new List<int>();
 
            var mas = new int[length];
 
            for (int i = 0; i < length; i++)
            {
                var random = rand.Next(0, 2);
                mas[i] = random;
                if (random == 1)
                    onesIndexes.Add(i);
                else zerosIndexes.Add(i);
            }
            
            while (onesIndexes.Count <= zerosIndexes.Count)
            {
                var zIndex = rand.Next(0, zerosIndexes.Count);
                mas[zerosIndexes[zIndex]] = 1;
                onesIndexes.Add(zerosIndexes[zIndex]);
                zerosIndexes.RemoveAt(zIndex);
            }
            return mas;
        }
 
static void Main(string[] args)
        {
            while (Console.ReadKey().Key != ConsoleKey.Escape)
            {
                int counter = 0;
                var list = GenerateOnesDominatedMassive(100).ToList();
 
                list.ForEach((x) =>
                {
                    counter++;
                    if (counter % 10 != 0)
                        Console.Write("{0}  ", x);
                    else
                    {
                        Console.Write("{0}{1}", x, Environment.NewLine);
                    }
                });
 
                var zCount = list.Count(x => x == 0);
 
                Console.WriteLine("Нулей: {0}", zCount);
                Console.WriteLine("Единиц: {0}{1}", list.Count - zCount, Environment.NewLine);
                
            }
        }
1
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
23.06.2016, 23:27  [ТС] 5
slashvlz, не подскажешь, как сделать, чтобы результат выводился в окно? То есть, я ввожу массив, а кол-во нулей/единиц, а так же результат - он выдает в окошко. Буду благодарен очень.
Просто все перепробовал, не получается(
0
29 / 29 / 18
Регистрация: 09.03.2016
Сообщений: 198
23.06.2016, 23:33 6
Amarok1234,
C#
1
Console.WriteLine(result);
Если на Windows Forms,
C#
1
MessageBox.Show(result);
Результат- result
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
23.06.2016, 23:46 7
Например так:
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
using System.Windows.Forms;
void Main()
{
    Random rnd=new Random();
    int len=1000000;
    double OnesMax=0.7;
    int OnesCount=rnd.Next(len/2+1,(int)(len*OnesMax));
    int[] arr=new int[len];
    for (int i = 0; i < OnesCount; i++)
    {
        int index=rnd.Next(0,len);
        while(arr[index]==1)
           index=rnd.Next(0,len);
        arr[index]=1;
    }
    Form f=new Form();
    f.Width=800;
    f.Height=600;
    TextBox tb=new TextBox();
    tb.Multiline=true;
    tb.ScrollBars= ScrollBars.Vertical;
    tb.Width=f.ClientSize.Width;
    tb.Height=f.ClientSize.Height;
    f.Controls.Add(tb);
    StringBuilder sb=new StringBuilder();
    arr.ToList().ForEach(x=>sb.AppendFormat("{0} ",x));
    tb.AppendText(sb.AppendLine().ToString());
    tb.AppendText(string.Format("Нулей:{0}",arr.Count(x=>x==0)));
    tb.AppendText(Environment.NewLine);
    tb.AppendText(string.Format("Единиц:{0}",arr.Count(x=>x==1)));
    f.ShowDialog();
    tb.ScrollToCaret();
    //Console.WriteLine ("Нулей:{0}",arr.Count(x=>x==0)));
    //Console.WriteLine ("Единиц:{0}",arr.Count(x=>x==1));
    //Console.WriteLine ("Массив:");
    //arr.ToList().ForEach(x=>Console.Write("{0} ",x));
}
1
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
24.06.2016, 00:08  [ТС] 8
FeddeLeGrand, то есть, чтобы мне вывести результат в окошко, мне нужно вместо этого:
C#
1
2
3
4
 Console.WriteLine ("Нулей:{0}",arr.Count(x=>x==0));
    Console.WriteLine ("Единиц:{0}",arr.Count(x=>x==1));
    Console.WriteLine ("Массив:");
    arr.ToList().ForEach(x=>Console.Write("{0} ",x));
Вставить вот это:
C#
1
MessageBox.Show(result);
?
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
24.06.2016, 00:13 9
Только в result конечно сначала текст весь поместить.
0
TheGreatCornholio
1249 / 727 / 285
Регистрация: 30.07.2015
Сообщений: 2,403
24.06.2016, 08:30 10
Зачем что-то генерить, когда можно перемешать массив 0 и 1, с заранее заданным соотношением их кол-ва?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            int countZeros = 10;
            int countOnes = 12;
 
            var seq = Enumerable.Repeat(0, countZeros)
              .Concat(Enumerable.Repeat(1, countOnes));      
 
            //shuffle
            Random rnd = new Random();
            var randomSeq = seq.OrderBy(x => rnd.Next());
 
            string outSeq = string.Join(" ", randomSeq);
 
            Console.WriteLine(outSeq);
 
            Console.ReadKey();
3
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
24.06.2016, 09:40  [ТС] 11
slashvlz, что-то не могу понять, не получается. Мне надо, чтобы кол-во нулей в одно окошко выходилось, а кол-во единиц - в другое. Вот как это записать? Подскажи, пожалуйста, буду благодарен
0
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
24.06.2016, 10:02 12
Код
string result1 = string.Format("{0} текст текст текст", arr.Count(x=>x==0));
string result2 = string.Format("{0} текст текст текст", arr.Count(x=>x==1));
А лучше использовать вариант от Woldemar89, не надо будет замерять количество, т.к. оно задоно заранее, что даст возможность генерить что-то типо 1000 единиц и 5 нулей.
В вариантах выше, это почти невозможно, уже на 75% результата дождаться очень трудно, а с 99.9% не реально.
0
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
24.06.2016, 10:17  [ТС] 13
EveKS, извиняюсь за беспокойство и за то, что спрашиваю по несколько раз, хочу понять.
Мне нужно, чтобы выводился результат количества нулей в одно окошко, а количество единиц в другое. Вот не могу понять, как это сделать. Или вместо Console.WriteLine вставить MessageBox.Show (и что-то ещё)?
Буду очень благодарен, если подскажите. Спасиб.
0
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
24.06.2016, 10:25  [ТС] 14
Вот, например, в окно А - количество нулей, а в окно В - количество единиц. Как это сделать?
Изображения
 
0
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
24.06.2016, 11:22 15
Лучший ответ Сообщение было отмечено Amarok1234 как решение

Решение

Amarok1234, если это Win Form, а точнее listBox. То подвязать к событию нажатия кнопки, ну или того, что вызывает событие генерации массива.

Не стоит заморачиваться
C#
1
2
3
4
5
public void SetOneZeroCount(string result1, string result2)
{
     lbOneName.Text = result1; // listBox
     lbZeroName.Text = result2;
}
Пусть будет кнопка:
C#
1
btnArrayMaker.Click += btnArrayMaker_Click;
C#
1
2
3
4
        private void btnArrayMaker_Click(object sender, EventArgs e)
        {
            ContentMaker?.Invoke(this, EventArgs.Empty);
        }
C#
1
public event EventHandler ContentMaker;
Потом к событию привязываем любой вариант генерации массива.

Можно проше...(ниже)

C#
1
btnArrayMaker.Click += btnArrayMaker_Click;
C#
1
2
3
4
        private void btnArrayMaker_Click(object sender, EventArgs e)
        {
             ArrayMake();
         }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            public static void ArrayMake()
           {
            Random rnd = new Random();
            int countZeros = rnd.Next(100);
            int countOnes = rnd.Next(countZeros / 2 - 1);
 
            var seq = Enumerable.Repeat(0, countZeros)
              .Concat(Enumerable.Repeat(1, countOnes));      
 
            //shuffle
            var randomSeq = seq.OrderBy(x => rnd.Next());
 
            string outSeq = string.Join(" ", randomSeq);
 
            SetOneZeroCount(countOnes.ToString(), countZeros.ToString())
        }
C#
1
2
3
4
5
public static void SetOneZeroCount(string result1, string result2)
{
     lbOneName.Text = result1; // listBox
     lbZeroName.Text = result2;
}
А массив можно вывести в том же TextBox, отправив туда outSeq. (Ps писал сразу сюда, не проверял).
1
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
24.06.2016, 11:25 16
Лучший ответ Сообщение было отмечено Amarok1234 как решение

Решение

EveKS, Согласен у Woldemar89 реализация лучше, хотя у меня идея была та же, не додумался как правильно перемешать.
Amarok1234, Вам уже EveKS ответил как, вам осталось в эти "окошки" вставить текст.
1
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
24.06.2016, 11:38 17
slashvlz, =) только обратил внимание, что форму уже сделали, даже в текстбоксы вставили...

PS

Ошибка у меня в прошлом посту, так будет правильнее.
C#
1
2
int countZeros = rnd.Next(2, 100);
int countOnes = rnd.Next(countZeros / 2 - 1);
1
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
24.06.2016, 11:40  [ТС] 18
Спасибо большое. Попробую сделать. Надеюсь, все получится��
0
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
24.06.2016, 12:19 19
IamRain, не плохо реализовал с индексами и удалением с подменой по индексу. Тоже быстро работает =)
slashvlz, потестил.
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
        static void Main(string[] args)
        {
            Random rnd = new Random();
            int len = 10000;
            double OnesMax = 0.999;
            int j = 0;
            int OnesCount = rnd.Next((int)(len * OnesMax), len);
            int[] arr = new int[len];
            for (int i = 0; i < OnesCount; i++)
            {
                int index = rnd.Next(0, len);
                while (arr[index] == 1)
                    index = rnd.Next(0, len);
                arr[index] = 1;
            }
 
            Console.WriteLine("Нулей:{0} {1}", len - OnesCount);
            Console.WriteLine("Единиц:{0} {1}", OnesCount);
 
            Console.WriteLine("Массив:");
            arr.ToList().ForEach(x =>
            {
                Console.Write("{0} ", x);
                j++;
                if (j % 75 == 0) Console.WriteLine();
            });
            Console.ReadKey();
        }
Тоже понравилось.
1
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
24.06.2016, 20:12  [ТС] 20
Ребят, может, я не так объяснил, но мне вот так нужно. То, что Вы выше писали - все хорошо, но не как у меня, к сожалению. Надеюсь, что поможете сделать так, как нужно мне.

Там, где строчка "массив" - ввожу массив с клавиатуры ;
Строчка, где кол-во единиц и количество нулей - выдает результат после того, как нажимаешь на кнопку "вычислить".

Вот как мне так сделать? у меня не получается. Скажите, пожалуйста, буду очень благодарен. Спасибо.
Миниатюры
Заполнить массив случайным образом 0 и 1 так, чтобы кол-во единиц было больше количества нулей  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2016, 20:12
Помогаю со студенческими работами здесь

Заполнить массив случайным образом
Добрый день!!! Ребята, объясните пожалуйста, как выполнить такую задачу!!! По возможности,...

Заполнить массив А (N) случайным образом
1) заполнить массив А (N) случайным образом целыми числами с диапазона ; 2) вывести элементы...

Заполнить массив равным количеством нулей и единиц
Как реализовать вопрос в теме? for i:=1 to 12 do begin a:=Random(2); ...

Заполнить массив случайным образом в диапазоне от -20 до 20
Заполнить массив случайным образом в диапазоне от -20 до 20,посчитать среднее всех элементов...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru