Генерация случайного числа с помощью препроцессора C - PullRequest
10 голосов
/ 18 марта 2011

Я хотел бы сгенерировать случайное число или строку, используя препроцессор C ... хм ... Я даже не знаю, возможно ли это, но я пытаюсь создать переменные наfly (здесь будут полезны строки) и присваивайте им значения (целые числа).Поэтому я пытаюсь сделать несколько вещей, но основной вопрос остается - могу ли я создать случайную строку или число с помощью препроцессора.

Ответы [ 3 ]

17 голосов
/ 02 июля 2013

На основе 1999-01-15 Джефф Стаут (спасибо @ rlb.usa)

#define UL unsigned long
#define znew  ((z=36969*(z&65535)+(z>>16))<<16)
#define wnew  ((w=18000*(w&65535)+(w>>16))&65535)
#define MWC   (znew+wnew)
#define SHR3  (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5))
#define CONG  (jcong=69069*jcong+1234567)
#define KISS  ((MWC^CONG)+SHR3)
/*  Global static variables: 
    (the seed changes on every minute) */
static UL z=362436069*(int)__TIMESTAMP__, w=521288629*(int)__TIMESTAMP__, \
   jsr=123456789*(int)__TIMESTAMP__, jcong=380116160*(int)__TIMESTAMP__;


int main(int argc, _TCHAR* argv[]){
    cout<<KISS<<endl;
    cout<<KISS<<endl;
    cout<<KISS<<endl;
}

Выход:

247524236
3009541994
1129205949
13 голосов
/ 18 марта 2011

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

gcc имеет расширение, которое называется __COUNTER__, и делает то, что вы ожидаете от его имени. Вы можете комбинировать это с конкатенацией макросов ## для получения уникальных идентификаторов.

Если у вас есть компилятор C99, вы можете использовать P99 . У него есть макросы, называемые P99_LINEID и P99_FILEID. Их можно использовать как

#include "p99_id.h"

P99_LINEID(some, other, tokens, to, make, it, unique, on, the, line)

и аналогично для P99_FILEID.

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

Эти два макроса также имеют аналоги P99_LINENO и P99_FILENO, которые просто генерируют большие числа вместо токенов-идентификаторов.

0 голосов
/ 18 марта 2011

Не делай этого в Си. Ты будешь путать людей.Если вам нужно создавать переменные на лету, используйте malloc и realloc и сохраняйте массив их значений.

Чтобы ответить на ваш вопрос, нет.Препроцессор не включает в себя генератор случайных чисел.Вы можете генерировать случайные числа во время выполнения (с rand()), но если они вам действительно нужны во время компиляции, вам придется написать свой собственный препроцессор и выполнить код через него.Или вы можете просто использовать 4, что было случайно определено броском честного 100-гранного кубика.

...