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

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

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

Студворк — интернет-сервис помощи студентам
Привет народ! Занимаюсь изучением 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2018, 18:47
Ответы с готовыми решениями:

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

Проверка на уникальность логина - MySql, Hibernate
У меня в базе данных есть таблица users с полями id, login, password. Поле login в таблице...

Выбор алгоритма для проверки символов строки на уникальность
Задача: проверить, уникальны ли все символы в строке. Написал два алгоритма static boolean...

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

Не по теме:

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

0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 19:20  [ТС]
А доказать обратное можешь? 8) Я же написал, эмулирует алгоритм выборки как в реале, тоесть приближаем реализвцию задачи к максимально реалистичным. Покрайне мере такова моя задумка.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 19:21
Цитата Сообщение от gangmaster Посмотреть сообщение
Там идет двойная выборка с шафлом.
видео не открывается.
Насколько я помню там просто крутиться хрень и из неё шары выпадают. Это можно эмулировать одним шафлом. Вероятность та же.
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 19:25  [ТС]
https://www.youtube.com/watch?v=MRxPyXMaIyo ссылка на видео. Ну смотри в машину закидывают массив, массив делает шафл, причем постоянно (ну это нюанс), мы из этого массива во время шафла, берем рандомна 5 + 2 8) Вероятность меняется или нет, это уже доказательство при помощи математики, теории чисел и теории вероятности, я же просто постарался повторить действия машины и реализовать их в джаве. Вопрос то совсем в другом, как бороться с рандомной выборкой нуля, когда его нет? И как прописать более умную проверку на наличии двух одинаковых чисел? С нулем вообще косяк какой-то у рандома, я понимаю что он там играет числом от нуля до 1, не включая, но епрст, этож не работает как надо.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 19:34
Лучший ответ Сообщение было отмечено 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
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
26.11.2018, 19:42
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(shuf fledArrayStar.length);
}
}
}
Поставь брэкпоинт на этом цикле и посмотри дебагом пару-тройку раз что там происходит. Я думаю, станет понятно, почему числа дублируются, нули появляются...
1
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 19:52  [ТС]
KEKCoGEN Я ссылку на неправильное видео скинул, там лото, а не лоттерея. Правильная вот https://www.youtube.com/watch?v=dz2Z0Cs6OTg. Ну окей, ты упростил выборку и сделал ее просто по шафлу, хорошо, это уменьшит код и упростит его, согласен. Тогда вопрос такой, нафига нам все методы аля Random и им подобные, если мы можем генерить массивы и шафлить их? Данные методы нам не помогут, если мы имеем дело с числами и избегаем пояления среди них 0? Или же в таком случаи нам всегда делать проверку на 0? Можешь разъяснить? Да и еще вопрос, что делать, если нам нужна истинно рандомная генерация, аля казино (простой шафл не прйдет сертификацию для казино)? Как быть?

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

Не по теме:

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

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

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

Добавлено через 38 минут
Спасибо всем за ответы, дали пищу для размышления и заодно почитаю о незнакомых мне фишках языка
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 20:54
gangmaster, методы рандом для получения псевдослучайных чисел очевидно. Насчет прохождения сертификации скзать не могу потому что требований не знаю.
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
26.11.2018, 21:03  [ТС]
KEKCoGEN да, я понял уже. Читаю о работе https://annimon.com/article/2778. Спасибо за наводку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2018, 21:03
Помогаю со студенческими работами здесь

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

Что можно добавить для улучшения кода?
import java.util.Scanner; public class Main { // Вариант 1 public static int w; ...

Генерация случайного числа, которое делится на 7 в определенном диапазоне
Как генерировать случайное число, допустим в диапазоне , но такое, которое бы нацело делилось на 7?

Генерация случайных чисел, кратных 10
собственно есть вопрос который я знаю как решить,но интересно узнать можно ли его реализовать с...

Подскажите как правильно сделать генерацию случайных чисел
Может кто-то подсказать как сделать генерацию случайных чисел. На примере этого x= 2+...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru