-1 голос
 
483 просмотра
15.12.2018 / 11:56  Death

Генерация случайного числа по ключу

Есть ли в java по дефолту класс для генерации числа по ключу?
Класс java.utill.Random не подойдёт.
Нужно, что-то, типо этого:
  1. RandomKey rnd = new RandomKey(1);
  2. Int i1 = rnd.nextInt(min, 2, max); //i1 = 5, min = 0, max = 100, 2 - ключ
  3. Int i2 = rnd.nextInt(min, 5,max); //i2 = 34
  4. Int i3 = rnd.nextInt(min, 2, max); //i3 = 5
Если при создании объекта рандома указать семя другое, не один, то и сгенерированные числа буду отличаться, но по ключу - схожи.
Изм. Death от 15.12.2018 / 11:56
15.12.2018 / 12:07  RblSb
Почему не подойдет?
15.12.2018 / 12:12  Витаминыч
Ну так напиши
Ответы
 
2 голоса
 
# 15.12.2018 / 22:00  aNNiMON
То, что ты назвал ключом ничем не отличается от второго сида. Просто придумай алгоритм, как объединить seed1 и seed2 так, чтобы при seed1 = x и seed2 = y всегда были одни и те же значения. Самый простой метод xor: seed1 ^ seed2.
  1. import java.util.Random;
  2.  
  3. public class RandomKey extends Random {
  4.  
  5.     private final long seed;
  6.  
  7.     public RandomKey(long seed) {
  8.         super(seed);
  9.         this.seed = seed;
  10.     }
  11.  
  12.     public int nextInt(int min, long key, int max) {
  13.         super.setSeed(seed ^ key);
  14.         return min + nextInt(max - min + 1);
  15.     }
  16.  
  17.  
  18.     public static void main(String[] args) {
  19.         final int min = 0, max = 100;
  20.         final RandomKey rnd1 = new RandomKey(1);
  21.         System.out.format("Key %d: %d%n", 2, rnd1.nextInt(min, 2, max)); // 36
  22.         System.out.format("Key %d: %d%n", 5, rnd1.nextInt(min, 5, max)); // 88
  23.         System.out.format("Key %d: %d%n", 2, rnd1.nextInt(min, 2, max)); // 36
  24.  
  25.         final RandomKey rnd2 = new RandomKey(3228);
  26.         System.out.format("Key %d: %d%n", 2, rnd2.nextInt(min, 2, max)); // 40
  27.         System.out.format("Key %d: %d%n", 5, rnd2.nextInt(min, 5, max)); // 9
  28.         System.out.format("Key %d: %d%n", 2, rnd2.nextInt(min, 2, max)); // 40
  29.     }
  30. }
Всего: 1

Реклама

Мы в соцсетях

tw tg yt gt