Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Randomizer


Автор: Entwickler 23.5.2007, 11:45
такая проблемка
Код

public class Randomizer
{
  static final int m = 2332980;
  static final int a = 9301;
  static final int c = 49297;
  
  //Die von jeder Randomizer Instanz verwaltete Variable
  int seed = 1;
  
  /***
   *Der Konstruktor der Klasse Randomizer. Er benötigt einen belibiegen
   *Anfangswert("seed") für die Pseudo-Zufallszahlen
   ***/
   public Randomizer(int seed)
   {
     this.seed = seed;
   }
   
   /**
    *Diese Methode berechnet mit einem sehr einfachen Algorithms eine Pseudo-
    *Zufallszahl zwischen 0 und 1. Math.random() und java.util.Random erzeugen
    *sehr viel besser verteilte Zufallszahlen
    **/
    public float randomFloat()
    {
      seed = (seed * a + c) % m;
      return (float)Math.abs((float)seed/(float)m);
    }
    
    /***
     *Diese Methode berechent eine ganze Pseudozufallszahl zwischen 0 und dem
     *angegebenen Maximum.Sie verwendet die oben definierte Methode randomFloat()
     ***/
     public int randomInt(int max)
     {
       return Math.round(max * randomFloat());
     }

     /***
      *Diese verschachtelet Klasse stellt ein einfaches Testprogramm dar:
      *Sie gibt einfach zehn zufällige ganze Zahlen aus. Beachten Sie,
      *wie der Startwert für das Randomizer-Object mit der aktuellen Uhrzeit
      *initialisiert wird
      **/

        public static void main(String[] args)
        {
          Randomizer r = new Randomizer((int)new java.util.Date().getTime());
          for(int i = 0; i < 10; ++i)System.out.println(r.randomInt(100));
        }
}

сверху я продекларировал переменные m,a и c . с мини всё работает прекрасно, но вот если я их немного измею, то он начинает выдавать несколько одинаковых чисел подряд... я хочу чтобы он выдавал только разные числа, можно как то это проверять уже имеющимися средствами или надо придумать алгоритм самому?

Автор: batigoal 23.5.2007, 12:36
<протупил...>

Почему ты не хочешь воспользоваться стандартным классом?

Код

import java.util.Random;

public class Rand
{
    public static void main(String[] args)
    {
        Random rand = new Random();

        for(int i=0; i<10; i++)
        {
            System.out.println(rand.nextInt());
        }
    }
}

Автор: nornad 23.5.2007, 13:52
Entwickler, генераторы псевдослучайных последовательностей должны инициализироваться определёнными числами. Потому что на большинстве инциализирующих групп они через некоторое время (иногда сразу, иногда через некоторое - даже большое - число шагов) зацикливаются и прекращают генерировать. Если хочешь изменить инициализаторы, то придётся подбирать вручную. Хотя, имхо, должны быть некие математические методы проверки.

Автор: danco31 23.5.2007, 22:54
  Сразу прошу прощения, но! Есть такая книжица у Дональда Кнута (D. Knuth), которая на восьмиста страницах примерно объясняет, что есть случайная и что - псевдослучайная последовательность, и как сделать хороший генератор. Разбирает ВСЕ - дотошно до тошноты (нечаянный такой каламбурчик). smile 
  Что касаемо примера, то - нормальный в целом генератор, только делитель возьми - простое число - это позволит повысить шансы получения цикла повторения последовательности размером с этот делитель. А еще лучше - три взаимно простых числа.

Автор: Alexandr87 24.5.2007, 06:07
Ну коль уж пошел такой разговор smile. Это линейный конгруэнтный генератор. Почитать можно в википедии.
http://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4
Там довольно неплохо объясняется принцип выбора коэффициентов.


Цитата(danco31 @  24.5.2007,  01:54 Найти цитируемый пост)
которая на восьмиста страницах примерно объясняет, что есть случайная и что - псевдослучайная последовательность, и как сделать хороший генератор.

Гыг, для того чтобы описать, что есть случайная, а что псевдо случайная последовательность - достаточно два абзаца. Надо будет почитать Кнута.


Цитата(danco31 @  24.5.2007,  01:54 Найти цитируемый пост)
Что касаемо примера, то - нормальный в целом генератор, 

Смотря для чего его использовать. Генератор не удовлетворяет требования криптостойкого генератора, со всеми вытекающими.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)