2013-03-25 1 views
6

Я хочу протестировать сетевую программу основном он посылает пакет на удаленный сервер с помощью UDP/TCP Я хочу, чтобы сгенерировать случайные байты потоков Я надеюсь, что эта функция какгенерировать случайный поток байт с `c`

u_char* gen_rdm_bytestream(int num_bytes) 
{ 
    u_char* stream=malloc(num_bytes); 
    ..... 
    // here how to generate? 
    .... 
    return stream; 
    } 

спасибо!

+1

Вы можете попробовать использовать стандартный librar y, которая возвращает случайные числа –

+0

После того, как память 'malloc' уже является« случайной »в некотором смысле. Это не случайно, но заполнено _trash_. Я думаю, этого должно быть достаточно для тестирования, я не думаю, что вам нужен криптосильный генератор случайных чисел. – maverik

ответ

6

Для каждого байта, вы можете вызвать функцию случайного числа генератора. Стандарт C обеспечивает функцию rand. Прежде чем использовать его, вы должны инициализировать случайную последовательность с вызовом srand.

gen_rdm_bytestream может выглядеть примерно так:

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

unsigned char *gen_rdm_bytestream (size_t num_bytes) 
{ 
    unsigned char *stream = malloc (num_bytes); 
    size_t i; 

    for (i = 0; i < num_bytes; i++) 
    { 
    stream[i] = rand(); 
    } 

    return stream; 
} 

srand ((unsigned int) time (NULL)); 

С stream беззнаковым, если значение, возвращаемое rand больше UCHAR_MAX, она будет уменьшена (по модулю UCHAR_MAX). Таким образом, вы получите псевдо-случайных чисел от 0 до 255.

+0

, если исправлено 'nr' в' srand (nr) ', то созданные байты всегда одинаковы, независимо от платформы, верно? – user138126

+0

@ user138126: Не обязательно, поскольку на каждой платформе нет одинакового генератора случайных чисел. Однако использование функции 'time', например, решило бы проблему. – md5

+0

Вы можете вырезать rand() и srand() и использовать arc4random() для лучшего результата. –

1

Да, у вас есть int rand (void); функцию в C,

Возвращает псевдо-случайное целое число в диапазоне от 0 до RAND_MAX. RAND_MAX - это константа, определенная в.

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

EDIT:

Как вы комментируете, я написал код для вас, что может помочь вам продемонстрировать, как использовать RAND(), программа и результат ее выполнения:

#include <stdio.h>  
#include <stdlib.h> /* srand, rand */ 
#include <time.h>  
int main(){ 
int i=0; 
srand (time(NULL)); 
printf("Five rand numbers: \n"); 
for(i = 1; i <= 5; i++){ 
    printf("\n %d", rand()); 
} 
printf("Five rand numbersb between 2 to 5: \n"); 
for(i = 1; i <= 5; i++){ 
    printf("\n %d", (2 + rand()%4)); 
}  
return 1; 
} 

выход:

Five rand numbers: 

1482376850 
1746468296 
1429725746 
595545676 
1544987577 

Five rand numbers, between 2 to 5: 

2 
5 
3 
4 
3 

Codepad Link

+1

это 'int', которые являются 4 байтами – user138126

+0

@ user138126' int' размер зависит от платформы в C.в Linux система для, вы можете проверить его размер с помощью оператора sizeof (int) –

+0

Я имею в виду, мне нужен случайный байт, здесь это случайные 4-байтовые единицы – user138126

0

Вот общая функция для получения случайных целых чисел в заданном диапазоне:

#include <stdlib> 

/** 
* Assumes srand has already been called 
*/ 
int randInRange(int min, int max) 
{ 
    double scale = 1.0/(RAND_MAX + 1); 
    double range = max - min + 1; 
    return min + (int) (rand() * scale * range); 
} 

Используя это, чтобы создать неподписанные char значения:

u_char randomByte() 
{ 
    return (u_char) randInRange(0, 255); 
} 

Так,

for (i = 0; i < numBytes; i++) 
    stream[i] = randomByte(); 
Смежные вопросы