Генерация уникальных случайных чисел в Java - PullRequest
68 голосов
/ 14 ноября 2011

Я пытаюсь получить случайные числа от 0 до 100. Но я хочу, чтобы они были уникальными, а не повторялись в последовательности. Например, если я получил 5 номеров, они должны быть 82,12,53,64,32, а не 82,12,53,12,32 Я использовал это, но он генерирует те же числа в последовательности.

Random rand = new Random();
selected = rand.nextInt(100);

Ответы [ 17 ]

0 голосов
/ 14 декабря 2018

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

for(int i=0;i<4;i++)
        {
            rn[i]= GenerateRandomNumber();
            for (int j=0;j<i;j++)
            {
                if (rn[i] == rn[j])
                {
                    i--;
                }
            }
        }
0 голосов
/ 18 июля 2018

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

package study;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
Created By Sachin  Rane on Jul 18, 2018
*/
public class UniqueRandomNumber {
    static Boolean[] boolArray;
    public static void main(String s[]){
        List<Integer> integers = new ArrayList<>();


        for (int i = 0; i < 10; i++) {
            integers.add(i);
        }


        //get unique random numbers
        boolArray = new Boolean[integers.size()+1];
        Arrays.fill(boolArray, false);
        for (int i = 0; i < 10; i++) {
            System.out.print(getUniqueRandomNumber(integers) + " ");

        }

    }

    private static int  getUniqueRandomNumber(List<Integer> integers) {
        int randNum =(int) (Math.random()*integers.size());
        if(boolArray[randNum]){
            while(boolArray[randNum]){
                randNum++;
                if(randNum>boolArray.length){
                    randNum=0;
                }
            }
            boolArray[randNum]=true;
            return randNum;
        }else {
            boolArray[randNum]=true;
            return randNum;
        }

    }

}
0 голосов
/ 04 марта 2018

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

public int GenerateRandomNo()
{
    int _min = 0000;
    int _max = 9999;
    Random _rdm = new Random();
    return _rdm.Next(_min, _max);
}
public int rand_num()
{
    randnum = GenerateRandomNo();
    string createText = randnum.ToString() + Environment.NewLine;
    string file_path = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\Invoices\numbers.txt";
    File.AppendAllText(file_path, createText);
    int number = File.ReadLines(file_path).Count(); //count number of lines in file
    System.IO.StreamReader file = new System.IO.StreamReader(file_path);
    do
    {
        randnum = GenerateRandomNo();
    }
    while ((file.ReadLine()) == randnum.ToString());
    file.Close();
    return randnum;

}
0 голосов
/ 20 февраля 2018

Это существенно не отличается от других ответов, но в конце я хотел получить массив целых чисел:

    Integer[] indices = new Integer[n];
    Arrays.setAll(indices, i -> i);
    Collections.shuffle(Arrays.asList(indices));
    return Arrays.stream(indices).mapToInt(Integer::intValue).toArray();
0 голосов
/ 12 июня 2017

Выберите n уникальных случайных чисел от 0 до m-1.

int[] uniqueRand(int n, int m){
    Random rand = new Random();
    int[] r = new int[n];
    int[] result = new int[n];
    for(int i = 0; i < n; i++){
        r[i] = rand.nextInt(m-i);
        result[i] = r[i];
        for(int j = i-1; j >= 0; j--){
            if(result[i] >= r[j])
                result[i]++;
        }
    }
    return result;
}

Представьте список, содержащий числа от 0 до m-1.Чтобы выбрать первый номер, мы просто используем rand.nextInt(m).Затем удалите номер из списка.Теперь осталось число m-1, поэтому мы звоним rand.nextInt(m-1).Число, которое мы получаем, представляет позицию в списке.Если оно меньше первого числа, то это второе число, так как часть списка до первого номера не была изменена при удалении первого числа.Если позиция больше или равна первому числу, второе число - это позиция + 1.Проделав дальнейший вывод, вы можете получить этот алгоритм.

Объяснение

Этот алгоритм имеет O (n ^ 2) сложность.Так что это хорошо для генерации небольшого количества уникальных чисел из большого набора.В то время как алгоритму тасования требуется по крайней мере O (m) для выполнения тасования.

Алгоритму на основе тасования также требуется память для хранения всех возможных результатов выполнения тасования, этот алгоритм не нужен.

0 голосов
/ 01 сентября 2015

попробуйте это

public class RandomValueGenerator {
    /**
     * 
     */
    private volatile List<Double> previousGenValues = new ArrayList<Double>();

    public void init() {
        previousGenValues.add(Double.valueOf(0));
    }

    public String getNextValue() {
        Random random = new Random();
        double nextValue=0;
        while(previousGenValues.contains(Double.valueOf(nextValue))) {
            nextValue = random.nextDouble();
        }
        previousGenValues.add(Double.valueOf(nextValue));
        return String.valueOf(nextValue);
    }
}
0 голосов
/ 12 мая 2015

Проверьте это

public class RandomNumbers {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n = 5;
        int A[] = uniqueRandomArray(n);
        for(int i = 0; i<n; i++){
            System.out.println(A[i]);
        }
    }
    public static int[] uniqueRandomArray(int n){
        int [] A = new int[n];
        for(int i = 0; i< A.length; ){
            if(i == A.length){
                break;
            }
            int b = (int)(Math.random() *n) + 1;
            if(f(A,b) == false){
                A[i++] = b;
            } 
        }
        return A;
    }
    public static boolean f(int[] A, int n){
        for(int i=0; i<A.length; i++){
            if(A[i] == n){
                return true;
            }
        }
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...