rand()、srand()随机生成数

博客介绍了库函数中用于产生随机数的srand()和rand()。rand()产生的是假随机数,每次执行结果相同,需用srand()初始化。srand()以系统定时/计数器值为随机种子,生成的也是伪随机数。指定不同种子可使随机序列不同,相同种子会生成相同序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

库函数中系统提供了两个函数用于产生随机数:srand()和rand();

rand函数:

头文件<stdlib.h>

定义函数:int rand(void),

函数功能:产生随机数,

函数说明:因为rand的内部是用线性同余法做的,不是真的随机数,只不过因为其周期特别长,所以在一定范围内可以看成是随机的,rand()会返回一随机值,范围在0到RAND_MAX间,在调用此函数产生随机数前,必须利用srand()设好随机数种子,若没有设随机数种子,rand()在调用时会自动设随机数种子为1。

返回值:返回0到RAND_MAX之间的整数值,RAND_MAX的范围最少在32767之间(int),即双字节(16位)。若unsigned int双字节是65535,且0-RAND_MAX每个数字被选中的随机率是相同的。 rand()产生的是假随机数,每次执行时是相同的,若要不同以不同的值来初始化,初始化的函数就是srand()。

srand函数:

头文件 <stdlib.h> ,

定义函数:void srand(unsigned int seed);

 函数声明:srand()用来设置rand()产生随机数时的随机数种子,参数seed必须是整数,通常可以用time(0)的返回值作为seed.如果每次seed都设置相同的值,rand()产生的随机数值每次都一样。

srand(unsigned)time(NULL))使用系统定时/计数器的值作为随机种子每个种子对应一组根据算法预先生成的随机数,所以在相同平台的环境下,不同时间产生的随机数是不同的,相应的若将srand(unsigned)tima(NULL)改为任一常量,则无论何时运行,运行多少次得到的随机数都是一组特定的序列,所以srand生成的随机数是伪随机数。但是,所谓的“伪随机数”指的并不是假的随机数,其实绝对的对技术只是一种假想状态的随机数,计算机只能生成相对的随机数,而这些随机数既是随机的又是有规律的,一部分遵守一定规律,一部分则不遵守任何规律,总结来说就是:计算机产生伪随机数而不是绝对的随机数 (注:该内容来自:百度百科-rand函数)

在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不完全相同了,而使用同种子相同的数调用rand()会导致相同的随机数序列被生成。

#include <stdlib.h> 
  #include <stdio.h> 
  #include <time.h> 
  main() 
  { 
    int i,k;
   srand( (unsigned)time( NULL ) ); 
   for( i = 0; i < 10;i++ ) 
  { 
     k=rand()%100+1;   //rand()%100表示取100以内的随机数,即取了随机数后再对100取余  x=rand()%(Y-X+1)+X 
     printf( " k=%d\n", k ); 
  } 
}
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(void)
{
    int i,j;
    for(i=0;i<10;i++)
    {
        j=1+(int)(10*rand()/(RAND_MAX+1));
        printf("%d  ",j); 
    }
    printf("\n");
    return 0;
    
}
<think>嗯,用户想用C语言实现随机生成二叉树的功能。首先,我需要回忆一下二叉树的结构。二叉树每个节点通常包含据、左子树和右子树指针。那用户给的示例代码是用前序遍历手动输入的,但现在需要改成随机生成。 那随机生成的话,应该考虑如何随机决定节点的存在与否,以及节点的据内容。可能需要设置一个随机生成的概率,比如每个节点有50%的概率生成左子节点和右子节点。同时,据部分可以用随机字符或者字填充。 首先,我需要用C语言的rand()生成随机。记得要设置种子,通常用srand(time(NULL))来初始化。然后,在创建节点时,随机决定是否继续生成左右子树。例如,当递归创建左子树时,生成一个随机,如果小于某个阈值(比如RAND_MAX/2),则继续生成,否则停止,左子树为NULL。 接下来,据部分可以随机选择字符,比如从'A'到'Z'之间随机选一个。可以用rand() % 26 + 'A'来实现。这样每个节点的据都是随机大写字母。 另外,原来的代码是用户输入生成,现在要改成自动生成,所以需要修改CrtBit函,去掉scanf的部分,换成随机生成逻辑。可能还需要调整函,比如添加一个层,控制树的深度,防止无限递归或者栈溢出。例如,当层超过一定值时,停止生成子节点。 测试的时候,主函里调用生成后,用遍历函打印节点,确保生成的树结构正确。同时要注意内存管理,不过示例代码中没有释放内存,可能需要提醒用户添加free函,避免内存泄漏。 可能的问题点:随机生成的树可能不平衡,或者深度过大导致栈溢出。所以需要设置最大层限制,比如在递归时传入当前层,当达到最大值时不再生成子节点。例如,设置MAX_DEPTH为5,层超过5则返回NULL。 然后,根据这些思路,编写代码。先定义节点结构体,然后写生成,在生成中使用随机决定是否创建左右子节点,随机生成。同时,遍历函可以用前序遍历来验证结果。 最后,测试代码,确保没有编译错误,运行后能生成随机二叉树并正确打印节点信息。可能还需要处理一些细节,比如在生成随机时避免重复相同的种子,或者调整生成概率来控制树的形状。</think>以下是用C语言实现随机生成二叉树的代码示例,包含自动生成节点和随机据功能: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_DEPTH 5 // 最大生成深度 #define TITLE "----------自动生成二叉树演示程序----------" typedef struct BitNode { char data; struct BitNode* lt; struct Bit Node* rt; } BitNode, *BitPtr; /* 随机生成二叉树(带深度控制)*/ void RandomCreateTree(BitPtr* root, int level) { if (level > MAX_DEPTH || rand() % 2 == 0) { // 随机终止条件[^1] *root = NULL; return; } *root = (BitPtr)malloc(sizeof(BitNode)); (*root)->data = 'A' + rand() % 26; // 随机生成大写字母 RandomCreateTree(&(*root)->lt, level + 1); RandomCreateTree(&(*root)->rt, level + 1); } /* 前序遍历打印树结构*/ void PrintTree(BitPtr root, int level) { if (!root) return; printf("层级 %d: %c\n", level, root->data); PrintTree(root->lt, level + 1); PrintTree(root->rt, level + 1); } /* 释放内存*/ void FreeTree(BitPtr root) { if (root) { FreeTree(root->lt); FreeTree(root->rt); free(root); } } int main() { srand(time(NULL)); // 初始化随机种子 BitPtr root = NULL; printf("%s\n", TITLE); RandomCreateTree(&root, 1); PrintTree(root, 1); FreeTree(root); return 0; } ``` 代码说明: 1. 使用$rand()$函控制节点生成概率,每个节点有50%概率继续生成子树[^1] 2. 节点随机生成大写字母(范围$'A'$到$'Z'$) 3. 设置$MAX_DEPTH$防止生成过深树结构 4. 包含内存释放函避免内存泄漏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值