Методология семян псевдордома для таблиц поиска
Вопрос
Может ли кто -нибудь предложить хороший способ взять Глобальный Значение семян, например «Привет, мир» и использование этого значения для поиска значений в массивах или таблицах.
Я как бы думал, как эта классическая игра «Элита» в «Элите», где были разные атрибуты для планет, но они не были случайными, просто полученными от значения семян для вселенной.
Я думал, что MD5 о входном значении, а затем использовал байты из хэша, поддавая их целым числу и модифицирует их в приемлемые индексы для таблиц поиска, но я подозреваю, что должен быть лучший способ? Я прочитал кое -что о Twisters Mersenne, но, возможно, это было бы излишним.
Я надеюсь на что -то, что даст хорошее отвлечение от значений в моих таблицах поиска. Например, красный, оранжевый, желтый, зеленый, синий, фиолетовый
Также, чтобы подчеркнуть, я не ищу случайных значений, а последовательные значения каждый раз.
Обновление: Возможно, мне трудно выразить свою собственную проблемную область. Вот пример сайта, который использует генераторы и может генерировать количество значений: http://www.seventhsanctum.com
Дополнительные критерии
Я бы предпочел работать с первых принципов, а не использовать библиотечные функции, такие как System.random
Решение
Мой подход будет использовать свой ключ в качестве семян для генератора случайных чисел
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));
}
Устанавливая семя в известное значение каждый раз, когда случайный человек возвращает одну и ту же последовательность каждый раз, когда он называется, поэтому при попытке хороших случайных значений хорошее семя очень важно. Однако в вашем случае известное семя даст результаты, которые вы ищете.
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)];
...
}
Заметьте разницу? Нет, и я не делал я.
Другие советы
Читать Эта ссылка , объясняет, как настроить MATLAB на некоторых системах Linux.
Здесь шаги, которые имеют отношение к вам:
Чтобы включить запущенные внешние программы, [& # 8230;] Fortran Библиотеки должны быть правильно обновлены и связаны.Посмотрите на вывод этой команды:
.ll "$MATLABDIR/bin/glnxa64/"
Вероятно, что [ссылка] существует:
.libgfortran.so.3 -> libgfortran.so.3.0.0
Поиск [Эта библиотека] на вашем компьютере:
.locate libgfortran.so
[...] Обновить ссылки MatLab, чтобы указать на эти новые версии:
.sudo ln -sf [location of libgfortran.so.3.0.0] "$MATLABDIR/bin/glnxa64/libgfortran.so.3"