2013-03-25 46 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

您可能需要使用标准l尝试返回随机数的库函数 – 2013-03-25 18:11:49

+0

'malloc'内存在某种意义上已经是'random'后。这不是真正的随机,而是充满了_trash_。我认为它应该足够用于测试,我不认为你需要密码强的随机生成器。 – maverik 2013-03-25 18:15:09

回答

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

如果'srand(nr)'中的'nr'是固定的,那么生成的字节总是相同的,无论平台是什么,对吧? – user138126 2013-03-25 18:35:49

+0

@ user138126:不一定,因为每个平台都没有相同的随机数生成器。但是,例如使用“time”函数可以解决问题。 – md5 2013-03-25 18:37:33

+0

你可以沟槽rand()和srand()并使用arc4random()获得更好的结果。 – 2016-03-10 00:07:14

1

是的,你在C int rand (void);功能,

返回0和RAND_MAX之间的范围内的伪随机整数。 RAND_MAX是一个常数定义。

该数字由算法生成,该算法每次调用时都会返回一系列明显不相关的数字。该算法采用了种子,通过函数生成的系列,它应该被初始化为一些独特的价值srand().

编辑

如你评论,我已经写了代码,你可以帮助您演示如何使用兰特(),程序和它的输出是:

#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 2013-03-25 18:15:29

+0

@ user138126'int'的大小取决于C中的平台。在Linux系统中,您可以使用sizeof(int)运算符 – 2013-03-25 18:17:41

+0

来检查其大小。我的意思是我需要随机字节,在这里它是随机的4字节单位 – user138126 2013-03-25 18:22:22

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();