Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
1

Проверка кода и советы по его улучшению. Генерация случайных чисел и проверка на уникальность

26.11.2018, 18:47. Показов 3221. Ответов 13

Author24 — интернет-сервис помощи студентам
Привет народ! Занимаюсь изучением Java, захотелось реализовать выборку случайных чисел для лотереи. Вроде бы все прописал и программа даже работает, но столкнулся с проблемой проверки чисел на уникальность. Следовательно хотелось бы услышать советы бывалых о том, как можно улучшить данный код и сделать проверку более умной.
На данный момент есть два больших косяка:
1) Иногда программа выдает 0 среди последовательностей чисел, хотя проверка на наличие нуля реализована в икле, но он все равно периодически выскакивает.
2) Проверка на уникальность числа. Когда программа делает проверку на наличии двух одинаковых чисел во втором массиве (от 1 до 12), проверка прекрасно проходит в первом цикле и меняет похожее значения, НО не учитывает, что при еще одной рандомной генерации может получится точно такое же число.

Собственно вот хотелось бы услышать ваше мнение и советы по этому поводу.

Java
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
public class Main {
    public static void main(String[] args) {
 
        List<Integer> mainNumbers = new ArrayList<>();
        List<Integer> starNumbers = new ArrayList<>();
 
        for (int i = 1; i < 51; i++) {
            mainNumbers.add(i);
        }
 
        for (int j = 1; j < 13; j++) {
            starNumbers.add(j);
        }
 
        Collections.shuffle(mainNumbers);
        Collections.shuffle(starNumbers);
        Integer[] shuffledArrayMain = mainNumbers.toArray(new Integer[0]);
        Integer[] shuffledArrayStar = starNumbers.toArray(new Integer[0]);
        System.out.println(Arrays.toString(shuffledArrayMain));
        System.out.println(Arrays.toString(shuffledArrayStar));
 
        int[] mainNum = new int[5];
        int[] starNum = new int[2];
 
        for (int x = 0; x < mainNum.length; x++) {
            mainNum[x] = ThreadLocalRandom.current().nextInt(shuffledArrayMain.length);
            if (mainNum[x] == 0) {
                mainNum[x] = ThreadLocalRandom.current().nextInt(shuffledArrayMain.length);
            }
        }
 
        for (int i = 0; i < mainNum.length; ++i) {
            for (int j = i + 1; j < mainNum.length; ++j) {
                if (mainNum[i] == mainNum[j]) {
                    mainNum[i] = ThreadLocalRandom.current().nextInt(shuffledArrayMain.length);
                }
            }
        }
 
        for (int y = 0; y < starNum.length; y++) {
            starNum[y] = ThreadLocalRandom.current().nextInt(shuffledArrayStar.length);
            if (starNum[y] == 0) {
                starNum[y] = ThreadLocalRandom.current().nextInt(shuffledArrayStar.length);
            }
        }
 
        for (int z = 0; z < starNum.length; ++z) {
            for (int e = z + 1; e < starNum.length; ++e) {
                if (starNum[z] == starNum[e]) {
                    starNum[z] = ThreadLocalRandom.current().nextInt(shuffledArrayStar.length);
                }
            }
        }
        System.out.println(Arrays.toString(mainNum) + Arrays.toString(starNum));
    }
}
Первый массив: [38, 42, 15, 3, 4, 33, 45, 1, 37, 6, 43, 14, 16, 7, 47, 24, 13, 23, 32, 17, 31, 41, 49, 35, 10, 12, 11, 19, 27, 34, 2, 44, 48, 26, 25, 28, 29, 8, 46, 30, 50, 18, 20, 9, 36, 5, 39, 21, 22, 40]
Второй массив:[11, 9, 6, 1, 4, 3, 7, 8, 12, 10, 2, 5]
Конечный массив: [11, 27, 16, 7, 44][2, 0] <- (Иногда (в маленьких скобках) выдает 0 или два одинаковых значения).
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2018, 18:47
Ответы с готовыми решениями:

Нужны советы по улучшению кода
Хотелось получить рекомендации по устранению критериев &quot;плохого кода&quot;(длинные,сложные...

Дайте советы по улучшению кода
Как можно улучшить код чтобы сократить время его выполнения до минимума? Можно как нибудь...

Проверка генератора случайных чисел
вот программа которая включает в себя генератор случайных чисел и &quot;проверку случайности чисел&quot;...

Игра "Змейка": советы по улучшению кода
Всем здрасте :) Только что зарегистрировался на форуме. Начал изучать программирование и c# где-то...

13
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 19:10 2
gangmaster, зачем брать рандомное число из перемешанного массива? Он уже и так рандомный и не содержит повторов.
Код читать лень там хрень все равно
Если есть числа 1—10 и надо взять 5 рандомных, достаточно сделать shuffle массиву и взять 5 первых чисел.
Программа должна занимать 3 строчки а не то что сейчас.
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 19:15  [ТС] 3
Ребята все очень просто. Программа эмулирует алгоритм попадпния шаров в барабан машины (Видели как в реале шары выбирают?). Там идет двойная выборка с шафлом.
0
iSmokeJC
26.11.2018, 19:18
  #4

Не по теме:

Цитата Сообщение от gangmaster Посмотреть сообщение
двойная выборка с шафлом
От этого вероятность поменяется что ли?

0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 19:20  [ТС] 5
А доказать обратное можешь? 8) Я же написал, эмулирует алгоритм выборки как в реале, тоесть приближаем реализвцию задачи к максимально реалистичным. Покрайне мере такова моя задумка.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 19:21 6
Цитата Сообщение от gangmaster Посмотреть сообщение
Там идет двойная выборка с шафлом.
видео не открывается.
Насколько я помню там просто крутиться хрень и из неё шары выпадают. Это можно эмулировать одним шафлом. Вероятность та же.
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 19:25  [ТС] 7
https://www.youtube.com/watch?v=MRxPyXMaIyo ссылка на видео. Ну смотри в машину закидывают массив, массив делает шафл, причем постоянно (ну это нюанс), мы из этого массива во время шафла, берем рандомна 5 + 2 8) Вероятность меняется или нет, это уже доказательство при помощи математики, теории чисел и теории вероятности, я же просто постарался повторить действия машины и реализовать их в джаве. Вопрос то совсем в другом, как бороться с рандомной выборкой нуля, когда его нет? И как прописать более умную проверку на наличии двух одинаковых чисел? С нулем вообще косяк какой-то у рандома, я понимаю что он там играет числом от нуля до 1, не включая, но епрст, этож не работает как надо.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 19:34 8
Лучший ответ Сообщение было отмечено gangmaster как решение

Решение

Цитата Сообщение от gangmaster Посмотреть сообщение
Вероятность меняется или нет, это уже доказательство при момощи математики, теории чисел и теории вероятности
ну так вот неплохо бы эту математику знать. Вероятность та же поэтому смысла в твоей программе нет и её можно сократить до

Java
1
2
3
4
5
        public static void main(String[] args) {
            List<Integer> numbers = IntStream.range(1, 52).boxed().collect(Collectors.toList());
            Collections.shuffle(numbers);
            System.out.println(numbers.subList(0, 5));
        }
1
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17573 / 10326 / 2820
Регистрация: 21.10.2017
Сообщений: 22,388
26.11.2018, 19:42 9
gangmaster, сделай
Java
1
ThreadLocalRandom.current().nextInt(1, shuffledArrayMain.length)
Нуля не будет

Добавлено через 7 минут
Цитата Сообщение от gangmaster Посмотреть сообщение
for (int z = 0; z < starNum.length; ++z) {
for (int e = z + 1; e < starNum.length; ++e) {
if (starNum[z] == starNum[e]) {
starNum[z] = ThreadLocalRandom.current().nextInt(shuffledArrayStar.length);
}
}
}
Поставь брэкпоинт на этом цикле и посмотри дебагом пару-тройку раз что там происходит. Я думаю, станет понятно, почему числа дублируются, нули появляются...
1
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 19:52  [ТС] 10
KEKCoGEN Я ссылку на неправильное видео скинул, там лото, а не лоттерея. Правильная вот https://www.youtube.com/watch?v=dz2Z0Cs6OTg. Ну окей, ты упростил выборку и сделал ее просто по шафлу, хорошо, это уменьшит код и упростит его, согласен. Тогда вопрос такой, нафига нам все методы аля Random и им подобные, если мы можем генерить массивы и шафлить их? Данные методы нам не помогут, если мы имеем дело с числами и избегаем пояления среди них 0? Или же в таком случаи нам всегда делать проверку на 0? Можешь разъяснить? Да и еще вопрос, что делать, если нам нужна истинно рандомная генерация, аля казино (простой шафл не прйдет сертификацию для казино)? Как быть?

Добавлено через 2 минуты
iSmokeJC я это делал. Числа появляются в связи с тем, что цикл заканчивается, а число УПС повторилось, я думаю это можно избежать при момощи while и условия на проверку, пока не убедится, что нет повторений. Что ты посоветуешь?
0
xoraxax
26.11.2018, 19:57
  #11

Не по теме:

Цитата Сообщение от gangmaster Посмотреть сообщение
Тогда вопрос такой, нафига нам все методы аля Random и им подобные, если мы можем генерить массивы и шафлить их? Данные методы нам не помогут, если мы имеем дело с числами и избегаем пояления среди них 0? Или же в таком случаи нам всегда делать проверку на 0? Можешь разъяснить? Да и еще вопрос, что делать, если нам нужна истинно рандомная генерация, аля казино (простой шафл не прйдет сертификацию для казино)? Как быть?
господи, что ты несешь :facepalm:

0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 20:38  [ТС] 12
xoraxax я не несу, а просто спрашиваю. Я же написал, что я только начал изучать и пытаюсь понять смысл и правильность моих действий. Конечно мой вопрос для тебя может звучать глупо, но так разъясни, в этом то и суть задавания вопросов. Поделись опытом 8) (P.S.: Вот что я имел ввиду https://lawstrust.com/ru/licen... ertificate)

iSmokeJC не заметил этого - ThreadLocalRandom.current().nextInt(1, shuffledArrayMain.length). Спасибо опробую

Добавлено через 38 минут
Спасибо всем за ответы, дали пищу для размышления и заодно почитаю о незнакомых мне фишках языка
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 20:54 13
gangmaster, методы рандом для получения псевдослучайных чисел очевидно. Насчет прохождения сертификации скзать не могу потому что требований не знаю.
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 21:03  [ТС] 14
KEKCoGEN да, я понял уже. Читаю о работе https://annimon.com/article/2778. Спасибо за наводку.
0
26.11.2018, 21:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2018, 21:03
Помогаю со студенческими работами здесь

Проверка кода на гавнокод и его оптимизация
Здраствуйте! я начию програмировать и пишу совсем несложный код, но хочу спросить у знающих как мне...

Возможна ли проверка кода и его запуск в инете?
В общем, я сижу с планшета и мне нужно учиться программировать на с++, к сожалению, ноутбука нет....

Проверка на уникальность
Чем лучше всего проверять статьи на уникальность?

Проверка на уникальность
Здравствуйте. Я делаю проверку при заполнении базы данных на то, что бы при вводе личного номера...


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

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