Неповторяющиеся случайные числа - PullRequest
5 голосов
/ 04 февраля 2011

В рамках моего проекта мне нужно создать неповторяющиеся 2 или 3-значные случайные числа, задав набор чисел. Я не хочу реализовывать список или массив для этого, так как я должен получить 1 случайное число для каждого вызова функции.

Я пытался сделать это, используя класс Java SecureRandom. Я также получил помощь от некоторых сайтов, но я застрял между ними, можем ли мы перетасовать ЦЕННОСТИ и сделать это? Но я не знаю, как это можно сделать. Может кто-нибудь мне помочь?

import java.security.SecureRandom;
public class RandomNumber {
private static final RandomNumber rnd= new RandomNumber();

    private static final char[] VALUES = new char[] {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};  
     private static final SecureRandom srn= new SecureRandom();
     public String createID()
     { 
       byte[] bytes = new byte[3]; 
       srn.nextBytes(bytes);

     }

Ответы [ 2 ]

12 голосов
/ 04 февраля 2011

Алгоритм Фишера-Йейтса - это путь. Это эффективно для перетасовки. и он работает за линейное время.

вот алгоритм

To shuffle an array a of n elements:
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]

и код

for(int i=VALUES.length-1; i>0; i--){
            int rand = (int) (Math.random()*i);
            char temp = VALUES[i];
            VALUES[i] = VALUES[rand];
            VALUES[rand] = temp;
    }
0 голосов
/ 09 мая 2013

Когда код Manoj повторяется, он с большей вероятностью меняет младшие элементы VALUES [], чем верхние.Пример: для i = 9 есть вероятность 1/10 его замены на любой элемент массива (включая самого себя).Тогда для i = 8 мы никогда не сможем снова поменять значения VALUES [9], потому что Math.random () * i может охватывать только от 0 до 8. Это означает, что значения VALUES [9] будут равны исходным значениям [9] чаще, чем любыедругой элемент будет равен своему соответствующему элементу (и так далее с возрастающей вероятностью замены при увеличении i).

Я просто хотел бы исправить вышеприведенный ответ для невесовых элементов массива:

for(int i=0; i <= VALUES.length - 1; i++){
        int rand = (int) (Math.random()*(VALUES.length-1));
        char temp = VALUES[i];
        VALUES[i] = VALUES[rand];
        VALUES[rand] = temp;

Теперь перемешивание выполняется значениями VALUES.length (или столько раз, сколько вам нужно) и не поддерживает какие-либо конкретные элементы массива.

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