Как создать функцию, которая возвращает уникальные случайные числа? - PullRequest
0 голосов
/ 06 февраля 2019

Я попробовал некоторые решения на форуме, но у меня не получилось, если ответ будет конкретным на языке котлин, тогда он мне будет более полезен.

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

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

1-й вариант

Вы можетеиспользуйте функцию List (да, это действительно функция здесь), чтобы сгенерировать список всех возможных чисел, затем перемешать его и после этого выполнить итерацию по нему.

class UniqueRandomNumbers(lowerBound: Int, upperBound: Int) {
    private val iterator = List(upperBound - lowerBound) { 
        lowerBound + it + 1
    }.shuffled().iterator()
    val next get() = if (iterator.hasNext()) iterator.next() else null
}

2-й вариант

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

class UniqueRandomNumbers(val lowerBound: Int, val upperBound: Int) {
    private val consumedNumbers = mutableSetOf<Int>()
    val next: Int?
        get() {
            var newNumber: Int

            if (consumedNumbers.size == (upperBound - lowerBound + 1)) {
                return null
            }

            do {
                newNumber = Random.nextInt(lowerBound, upperBound + 1)
            } while (newNumber in consumedNumbers)

            consumedNumbers += newNumber

            return newNumber
        }
}

Использование в обоих случаях:

val numberProvider = UniqueRandomNumbers(0, 2)

// returns 0, 1, 2 or null if all numbers have been consumed
numberProvider.next 
0 голосов
/ 06 февраля 2019

Как сказал Эндрю Томпсон здесь вы можете

  • Добавить каждое число в диапазоне последовательно в списке
  • Shuffle it
  • Takeпервые 'n' чисел из списка

Простая реализация будет выглядеть следующим образом:

import java.util.ArrayList;
import java.util.Collections;

public class UniqueRandomNumbers {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i=1; i<11; i++) {
            list.add(new Integer(i));
        }
        Collections.shuffle(list);
        for (int i=0; i<3; i++) {
            System.out.println(list.get(i));
        }
    }
}

Это выведет 3 уникальных случайных числа от 1 до 10

0 голосов
/ 06 февраля 2019
int[] Numbers;
int num = 0;

getRandomNum();

public void getRandomNum()
{
   Random rand = new Random(10);
   if(Numbers.contains(rand))
   {
      Log.i("console","Try Again");
   }
   else
   {
      num = rand;
      Numbers.add(rand); 
   }
}
0 голосов
/ 06 февраля 2019

Вы можете попробовать это с помощью функции рекурсии, которая будет возвращать только уникальное случайное число в диапазоне от 0 до 6.

private var randomNumber: Int = 0
private var integerList: MutableList<Int>? = null

private fun getRandomNumber(): Int {
    val rand = Random()
    randomNumber = rand.nextInt(7)
    if (integerList!!.contains(randomNumber)) {
        getRandomNumber()
    } else {
        integerList!!.add(randomNumber)
    }
    return randomNumber
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...