Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 5
1

Программа не работает правильно без "Console.ReadLine()"

06.03.2016, 13:54. Показов 2018. Ответов 3
Метки нет (Все метки)

Помогите решить проблему. Пишу программу, которая генерирует 45 случайных шестиразрядных чисел. Условие задачи такого, что цифры в числах не должны повторяться. После чего программа считает какая цифра в этих числах повторяется чаще всего. Я написал весь код к этой задаче: и генератор чисел, и подсчет цифр. Но! Программа работает только, если после каждого сгенерированного числа ожидается ввод с клавиатуры(Console.ReadLine()). Объясните в чем проблема. Если убрать строку Console.ReadLine() то все числа будут одинаковыми. Как исправить эту ошибку?
Ниже приведен код(методы для генерации чисел и метод Main). Часть кода я вырезал.

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
static int Generate()
    {
        int[] mass = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
        string s = "";
        Random r = new Random();
        for (int i = 0; i < 6; i++)
        {
            if (i == 0)
            {
                int ran = r.Next(0, mass.Length - 2);
                s += mass[ran];
                mass = DelEl(mass, ran);
            }
            else
            {
                int ran = r.Next(0, mass.Length - 1);
                s += mass[ran];
                mass = DelEl(mass, ran);
            }
        }
        return int.Parse(s);
    }
 
        static int[] DelEl(int[] mass, int ran)
    {
        int[] mass2 = new int[mass.Length - 1];
        for (int i = 0; i < mass2.Length; i++)
        {
            if (i < ran)
                mass2[i] = mass[i];
            else
                mass2[i] = mass[i + 1];
        }
        return mass2;
    }
 
static void Main(string[] args)
{
int[] array = new int[45];
Console.WriteLine("Автоматическое генерирование чисел:");
                for(int i = 0; i < array.Length; i ++)
                {
                    array[i] = Generate();
                    Console.ReadLine(); // Если убрать эту строку, то все значения элементов будет одинаковыми!
                    Console.WriteLine("Число номер {0, 2} получило значение = {1}", i + 1, array[i]);
                }
Console.ReadLine();
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2016, 13:54
Ответы с готовыми решениями:

Если вместо Console.ReadLine написать Console.Read, начинает неправильно выполняться программа
Доброго времени суток, господа и дамы. Хотелось бы услышать объяснение от профессионалов, ибо...

Как исправить ошибки:"Ни одна из перегрузок метода "ReadLine" не принимает "1" аргументов"
Как исправить ошибки: &quot;Нeявное преобразование типа double в bool невозможно&quot;//строка 55 &quot;Ни одна...

Что выведется на экран после выполнения следующего утверждения: Console.WriteLine("Sharp is neat".Replace("is", "AAA")
A) SharpAAAneat B) SharpAAA neat C) Sharp AAA neat D) Sharp AAAneat

Как работает Console.ReadLine() (и не только он)?
Не могу понять как это работает. Как он возвращает значение только после того, как что-то ввели. ...

3
Эксперт .NET
14880 / 11266 / 2952
Регистрация: 17.09.2011
Сообщений: 18,871
06.03.2016, 13:56 2
Лучший ответ Сообщение было отмечено Proty как решение

Решение

Цитата Сообщение от Proty Посмотреть сообщение
Как исправить эту ошибку?
Вынесите создание экземпляра класса Random за пределы метода Generate: передавайте его в метод или объявите статическим:
C#
1
2
3
4
5
6
static readonly Random r = new Random();
static int Generate()
    {
        int[] mass = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
        string s = "";
        ...
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 5
06.03.2016, 13:59  [ТС] 3
Спасибо. Не могли вы бы объяснить, почему до этого генерация чисел была неправильной? А что-то я не совсем понимаю.
0
Эксперт .NET
14880 / 11266 / 2952
Регистрация: 17.09.2011
Сообщений: 18,871
06.03.2016, 14:03 4
Лучший ответ Сообщение было отмечено Proty как решение

Решение

Цитата Сообщение от Proty Посмотреть сообщение
почему до этого генерация чисел была неправильной?
Потому что компьютер — машина точная и не может генерировать поистине случайные числа, он может генерировать только псевдослучайные числа — такие, которые имеют видимость случайных, но на самом деле высчитываются по хитрой формуле.
Важнейший параметр для такой формулы — так называемое зерно — значение, на основе которого генерируется псевдослучайная последовательность.
Если вы в конструктор экземпляра передадите, скажем, 10, то получите одну последовательность, если 20 — другую.
Если не передадите ничего (что у вас и происходит), то классу придется брать зерно где-то в другом месте, и он в качестве зерна использует текущее системное время. Проблема тут в том, что системное время обновляется где-то раз в 16 милисекунд, а цикл, в котором вызывается Generate, отрабатывает намного быстрее. В результате все создаваемые в цикле экземпляры Random используют в качестве зерна одно и то же значение, в итоге генерируя одну и ту же последовательность.

Ну а если вы добавите Console.ReadLine, то для вызова следующего метода вам нужно нажать Enter, что увеличивает время между созданиями экземпляров и позволяет системному времени обновиться.
4
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2016, 14:03

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Какая разница между Console.ReadLine() и Сonsole.In.ReadLine()?
какая разница между Console.ReadLine() и Сonsole.In.ReadLine() ?

Вычисление площади квадрата, ошибка "Console" не содержит определение для "Writeline"
Начал изучать C# и в первом же уроке ошибка, суть программы вычислить площадь по заданным...

CS0117 "Console" не содержит определение для "ReadKey". ConsoleApp3.DNX Core 5.0
Хочу чтобы консоль закрывалась при нажатии клавиши,но выбивает ошибку.Если прописую...

Ошибка "System.Console" не содержит определение для "Writeline" (CS0117)
Здравствуйте. Такая проблема. Написала код, но программа выдает &quot;System.Console&quot; не содержит...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.