>

포럼에서 몇 가지 해결책을 시도했지만 나에게 도움이되지 못했습니다. 답변이 kotlin 언어로 구체적이면 더 도움이 될 것입니다.

  • 답변 # 1

    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
    }
    
    

  • 답변 # 2

    앤드류 톰슨이 말했듯이

    범위의 각 숫자를 목록에 순차적으로 추가

    셔플

    목록에서 첫 번째 '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));
            }
        }
    }
    
    

    1에서 10까지 3 개의 고유 한 난수를 인쇄합니다

  • 답변 # 3

    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); 
       }
    }
    
    

  • 답변 # 4

    먼저 그 기능을 추천하지 않고 사용성을 높이는 논리를 캡슐화하는 클래스를 사용하십시오.

    첫 번째 옵션

    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
    }
    
    

    두 번째 옵션

    또는 이전에 소비되지 않은 숫자를 찾을 때까지 임의의 숫자를 생성 할 수 있습니다.

    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
    
    

관련 자료

  • 이전 ios - 앱과 오늘 위젯간에 이미지 리소스 공유
  • 다음 java - JSON을 무시 무시 ID 값?