@MdaUZH

Как сгенерировать рандомные не одинаковые числа?

Всем привет)

Нужен генератор случайных чисел, но чтобы числа не повторялись..

Делаю так:

Random random = new Random();

    ..
    ArrayList<Integer> rtn = getFalseRandom(5);

        for(int i=0;i<rtn.size();i++){
            Log.d("TAG", "LOL "+rtn.get(i).toString());
        }
    ...

    public ArrayList<Integer> getFalseRandom(int count){
        ArrayList<Integer> rtn = new ArrayList<Integer>();
        for(int i=0;i<3;i++) { // 3 потому что нужно 3 числа
            int n = getContainsRandom(rtn, count)+1;
            rtn.add(n);
        }
        return rtn;
    }

    public int getContainsRandom(ArrayList<Integer> list, int count){
        int n = random.nextInt(count);
        if(!list.contains(n)) {
            return n;
        }
        return getContainsRandom(list,count);
    }


Но он работает не так как нужно, все равно есть одинаковые числа...

Подскажите пожалуйста почему так
  • Вопрос задан
  • 918 просмотров
Решения вопроса 2
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
У вас линейная сложность(поиск в массиве) плюс рекурсия на такую простую операцию.
Set<Integer> used = new HashSet<>();
...
public int getContainsRandom( Set<Integer> used ){
    int i;
    do{
        i = random.nextInt(...);
    while(used.contains(i));
    used.put(i);
    return i;
}
Ответ написан
VYakushev
@VYakushev
Разработчик Android в Nowtaxi
int n = getContainsRandom(rtn, count)+1;

В методе getContainsRandom вы проверяете свой список на вхождение числа, но в список помещаете число на единицу большее. И вот тут уже нет гарантий, что его в списке нет. К примеру, getContainsRandom вам вернет цифру 3 т.к. её нет в списке и вы в список помещаете цифру 4, а она уже в списке может быть.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы