Методика псевдослучайного семени для таблиц поиска - PullRequest
1 голос
/ 24 января 2010

Может ли кто-нибудь предложить хороший способ получения глобального начального значения, например «Hello World» и использование этого значения для поиска значений в массивах или таблицах.

Я вроде как классическая космическая игра "Элита", в которой были разные атрибуты для планет, но они не были случайными, просто были получены из начального значения для вселенной.

Я думал о входном значении MD5 и затем использовал байты из хэша, приводя их к целым числам и модифицируя их в приемлемые индексы для таблиц поиска, но я подозреваю, что должен быть лучший способ? Я читал кое-что о твистерах Мерсенна, но, возможно, это было бы излишне.

Я надеюсь на что-то, что даст хорошее распределение по значениям в моих таблицах поиска. например Красный, оранжевый, желтый, зеленый, синий, фиолетовый

Также, чтобы подчеркнуть, я не ищу случайные значения, но постоянные значения каждый раз.

Обновление: возможно, у меня возникают трудности с выражением моей собственной проблемной области. Вот пример сайта, который использует генераторы и может генерировать X количество значений: http://www.seventhsanctum.com

Дополнительные критерии

Я бы предпочел работать исходя из первых принципов, а не использовать библиотечные функции, такие как System.Random

Ответы [ 2 ]

2 голосов
/ 24 января 2010

Мой подход заключается в использовании вашего ключа в качестве начального числа для генератора случайных чисел

public StarSystem(long systemSeed){
    java.util.Random r = new Random(systemSeed);
    Color c = colorArray[r.nextInt(colorArray.length)]; // generates a psudo-random-number based from your seed
    PoliticalSystem politics = politicsArray[r.nextInt(politicsArray.length)];
    ...
}

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

Для получения начального начального числа из строки вы можете просто использовать MD5Sum и получить первые / последние 64 бита для вашего длинного, другой подход - просто использовать числовое значение для каждого растения. Elite также генерирует имена для каждой системы, используя свой псевдослучайный генератор.

for(long seed=1; seed<NUMBER_OF_SYSTEMS; seed++){
    starSystems.add(new StarSystem(seed));
}

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

Эквивалент c # равен

public StarSystem(int systemSeed){
    System.Random r = new Random(systemSeed);
    Color c = colorArray[r.next(colorArray.length)]; // generates a psudo-random-number based from your seed
    PoliticalSystem politics = politicsArray[r.next(politicsArray.length)];
    ...
} 

Заметили разницу? нет, и я тоже.

1 голос
/ 24 января 2010

Многие распространенные генераторы случайных чисел генерируют одну и ту же последовательность при одинаковом начальном значении, поэтому кажется, что все, что вам нужно сделать, - это преобразовать ваше имя в число. Есть любое количество хеш-функций, которые это сделают.

Дополнительный вопрос: Требуется ли, чтобы все уникальные строки генерировали уникальные хэши и, следовательно, (вероятно) уникальные псевдослучайные последовательности.

...