2013-08-22 3 views
0

Как написать функцию случайного генератора без использования стандартных функций C, таких как функции времени, статические переменные или глобальные переменные?Как написать случайную функцию генератора без использования временных функций, статических переменных или глобальных переменных?

/* #include <time.h> Don't use time functions. */ 
/* int seed = 1234; Don't use global variables. */ 
int generate_random(void) 
{ 
    /* static int seed = 1234; Don't use static variables. */ 
    /* return (time() % 100); Don't use time functions. */ 
} 

Другими словами, это random generator function не должны помнить, последнее состояние.

+0

Вы имеете спроектировать один, то попробуйте написать ... –

+1

здесь: [Генерация случайных чисел без использования каких-либо внешних функций] (http://stackoverflow.com/questions/15038174/generate- random-numbers-without-use-any-external-functions/15040471 # 15040471) Я предложил некоторый источник для полезной записи случайной функции –

+0

Какова цель? Если он будет действительно случайным, он должен быть основан на генераторе аппаратного шума. В некоторых операционных системах есть устройство, которое собирает случайные данные, которые можно использовать .... – wallyk

ответ

0

сделать

#include <time.h> 
#include <stdlib.h> 

srand(time(NULL)); 
int r = rand(); 

если вы хотите ограничить использование номер

int r = minNum + rand() % maxNum; 

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

+5

Вы читали ограничения? В нем нет временных функций. – wallyk

2

вы также можете использовать srand по

#include<stdlib.h> 

srand(getpid()); 

int num = rand(); 
+0

Если цель упражнения состоит в том, чтобы избежать глобального состояния, srand/rand не будет работать, потому что они используют глобальное состояние внутри страны. – user694733

-1

Гадать о вашем вопросе ... Я должен спросить, что это требование для желающих случайного семени?

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

Если ваш вопрос о случайных числах в целом. Для генерации серии случайных чисел требуется два шага.

Сначала задайте начальное значение, например, srand(1234);, где 1234 - это начальное значение. Ваш код обрабатывает эту инструкцию только один раз. Когда вы запускаете программу во второй раз, ваш код может повторно использовать одно и то же начальное значение, и в этом случае последовательность случайных чисел будет одинаковой. Если вы установите другое семя, вы получите другую последовательность случайных чисел.

Второй шаг - получить значения случайных чисел для использования в вашем коде.

Один из возможных методов

В теории, можно использовать фиксированное начальное значение, а затем генерировать случайные числа R, где К some number taken from the system мод 100 (к примеру). Затем используйте это случайное число R'th в качестве начального значения для фактической последовательности случайных чисел для вашего приложения.

Вы говорите, что не хотите использовать Time(), но, возможно, в этой двойной последовательности случайных чисел и функция Time() mod n обеспечит достаточную случайность.

Теперь, я говорю в теории, потому что случайные числа от rand() на самом деле являются псевдо-случайными и для всех целей и задач они действительно являются случайными (ребята с математиками-кандидатами говорят об этом ...), поэтому я сомневаюсь, двойной выбор "сделает номера более случайными. Но этот метод или такой, как это может сделать рецензент или босс чувствовать себя более комфортно, но это было бы ложным чувством безопасности.

0

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

Если функция не должна запоминать последнее состояние, необходимо передать его в качестве аргумента:

int generate_random(int * lastState) 
{ 
    // generate next random from lastState 
    // store state to lastState 
    // return result 
} 

int main(void) 
{ 
    int lastState = 1234; // seed it 
    int random = generate_random(&lastState); 
} 
1

Это решение отвечает всем вашим критериям, но это требует Интернет. *

unsigned generate_random() { 
    FILE *random; 
    char cmd[512]; 
    unsigned number; 

    snprintf(cmd, sizeof(cmd), 
     "wget -qO - " 
     "'http://www.random.org/integers/" 
     "?num=1&min=0&max=%u&col=1&base=10&format=plain&rnd=new'", 
     USHRT_MAX); 

    random = popen(cmd, "r"); 
    fscanf(random, "%u", &number); 
    pclose(random); 

    return number; 
} 

* Это на самом деле не знаком с алгоритмом, однако, поскольку Интернет является прекрасным источником случайных данных. ;-)

Смежные вопросы