Я проверил документацию stdlib и там сказано, что мы можем использовать unsigned long int как семя для srand(). Проблема заключается в следующем: мне нужно использовать число до 40 цифр в качестве семени. Это семя извлекается из матрицы ассоциаций, используемой для многомерной проблемы модуляции CMAC.
Как я могу решить эту проблему? В качестве примера см. Следующий код:
#include <stdlib.h>
int main(int argc, char ** argv)
{
int inputVariable = getStateOfAdressedSpace();
int generatedNumber;
unsigned long long mySeed = getSeedFromMatrix( inputVariable );
srandom( mySeed );
generatedNumber = random( );
}
Это очень слабый пример, но это потому, что весь код будет слишком большим, чтобы продемонстрировать, просто представьте, что переменная mySeed будет очень длинным целым числом, и там, где лежит моя проблема. Я был бы очень благодарен, если кто-нибудь покажет мне, как это можно сделать, возможно, даже используя метод генератора псевдослучайных чисел (PRNG) или что-то в этом роде. Имейте в виду, что сгенерированное число должно быть уникальным.
Простым способом достижения чего-то, что будет "неотличимым от случайного" и которое использует все цифры произвольного количества семян, было бы следующее (непроверенное - это просто показать принцип):
char* mySeed = "123454321543212345678908765434234576897654267349587623459872039487102367529364520";
char bitOfString[6];
int ii;
long int randomNumber=0;
for(ii=0; ii<strlen(mySeed)-5; ii+=5) {
strncpy(bitOfString, mySeed+ii, 5);
bitOfString[5]='\0';
srandom(atoi(bitOfString));
randomNumber += random();
}
randomNumber = randomNumber % RAND_MAX;
Это генерирует случайные числа на основе "того, что достаточно мало, чтобы быть семенем" (я использовал число 5
для длины строки, но вы могли выбрать другое число, в зависимости от размера int
на вашем компьютере). Вы можете сделать это "более случайным", не выбирая только первое случайное число, сгенерированное в каждом цикле, но Nth (так что замена блоков цифр не приведет к такому же результату).
Нижняя строка - вы создаете другую случайную последовательность. Математическая невозможность того, что каждый из 10 40 семян даст другое случайное число - этот метод должен отображать семя "произвольного размера" на равномерно распределенное число в диапазоне генератора случайных чисел.
Обратите внимание, что я использовал long int
для randomNumber
хотя random()
создает int
random. Это позволяет суммировать несколько случайных чисел, не опасаясь переполнения - и окончательное модульное деление гарантирует, что число, в котором вы закончите, будет (приблизительно) равномерно распределенным (особенно, если вы закончите делать большое количество вызовов random()
),,
Ждем ваших размышлений об этом.