一个C语言编写的不重复随机序列算法

最近一直搞数据库,很久没摸C语言,都快忘了。为了练手,前段时间一个没有完成的产生不重复随机序列的算法重写一遍。

C语言没有随机种子值的概念,所以产生一个随机、不重复序列还不太容易。最常归的思路是:给定一个范围,然后做rand() %MAX_VALUE运算,如果发现该值已经取过,则重新产生一个值。这个算法,你会发现随着,当MAX_VALUE值大到一定程度时(我的测试值为20),就会陷入死循环。原因是,比如20个数,取了前面18个数,产生后面两个数的几率就会指数及减小,可能做上百万次运算,也无法产生最后两个数。于是自己重新想了一种算法。

算法原理:给出两个数列,产生一个随机数,将第二个数列该位置上的数,复制到第一个数列,然后对第二个数列进行压缩,知道所有的值都使用完为止。如图:

第一轮迭代

将临时数列进行压缩,进行第二轮迭代:

这样,基本可以产生一个均匀不重复的随机数列。但是,根据测试结果,同一个MAX_VALUE值,每次产生的随机数列是一样的,所以,若将此应用于生产,还需做其他处理。

源代码如下:

#include"stdafx.h"

#include

#include

#include

intrand_array(int* arr, int floor);

voidMergArr(int* pArr, int nSize);

#defineMAX_VALUE    10

int main(intargc, char** argv)

{

int rand_list[MAX_VALUE];

int ret = 0;

int i = 0;

ret = rand_array(rand_list, MAX_VALUE);

for (i = 0; i < MAX_VALUE; i++)

{

printf("rand_list[%d]:%d\r\n", i, rand_list[i]);

}

return 0;

}

intrand_array(int* pArrList, int nFloor)

{

int i = 0;

int* pArrTmp = NULL;                // 临时数组

int nRand = 0;

int nTotal = 0;

int nLastSize = 0;

int nMemSize = nFloor * sizeof(int) +1;

// 先为数组分配内存

pArrTmp =  (int*)malloc(nMemSize);

if (pArrList == NULL || pArrTmp ==NULL)

{

return -1;

}

// 初始化数组

for (i = 0; i < nFloor; i++)

{

pArrList[i] = -1;

pArrTmp[i] = i;

}

nLastSize = nFloor;

// 产生随即数,并从pArrTmp表填至pArrList

while (nTotal < nFloor)

{

nRand = rand() % (nFloor -nTotal);

if (pArrTmp[nRand] != -1)

{

pArrList[nTotal] =pArrTmp[nRand];

pArrTmp[nRand] = -1;

nTotal++;

}

else

{

MergArr(pArrTmp,nLastSize);

nLastSize = nFloor -nTotal;

}

}

free(pArrTmp);

pArrTmp = NULL;

return 0;

}

voidMergArr(int* pArr, int nSize)

{

int i = 0;

int total = 0;

for (i = 0; i < nSize; i++)

{

if (pArr[i] != -1)

{

pArr[total] =pArr[i];

if (total != i)

pArr[i] =-1;

total++;

}

}

}

生成随机序列的算法c语言,一个C语言编写的不重复随机序列算法相关推荐

  1. C语言 一个 long long 数字转 char 字符串的算法

    哈哈哈哈破案了 最新解法:格式化IO sprintf(str, "%lld", lli); 下面这做法现在看一次笑一次哈哈哈 工作需要,但是C语言标准库里没有这个,所以自己实现. ...

  2. shuffle洗牌算法java_js打乱一个数组 的 洗牌(shuffle )算法

    写php的时候 有个shuffle  函数很爽很好用,但是js要实现同样算法的时候发现没有现成函数,在网上看了大量的例子,觉得不靠谱所以,自己写了一个,其实非常简单,以下是实现代码 var shuff ...

  3. 冒泡排序c语言子程序,C语言之冒泡排序算法

    一.搭建Zookeeper集群Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务--分布式同步(DistributedSynchronization) ...

  4. 熟悉c语言,熟悉c语言编程环境.ppt

    熟悉c语言编程环境.ppt 程序设计基础 C语言程序设计,主讲朱海燕 gxzhy2003,课程性质 专业必修课 课程类型 理论课(3/5),含实践(2/5) 学分 3.5学分 学时(周学时) 85学时 ...

  5. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

  6. php 实现的字典序排列算法,字典序的一个生成算法

    字典序的一个生成算法. 最近在LeetCode刷题,刷到一个题,链接: https://leetcode-cn.com/problems/permutation-sequence/ 这个题要求得长度为 ...

  7. C语言第一行是1第二行是1和2,【C语言】第一个C语言小程序 —— 日期算法和万年历 2...

    1. 上一篇我们只完成了 a. 算出某年某月某日是星期几 b. 打印出某年某月的日历 这一次我写了一个打印某一年的日历.一开始我是不打算写的,因为可以调用之前的方法,分别打印出这一年12个月的日历.但 ...

  8. 一个借鉴现代OS的MMU的排序算法

    很久很久以前,我写过两篇文章,关于一个突然想出来的点子整合出来的一个排序算法: 移位排序算法–从赛跑想到的:http://blog.csdn.net/dog250/article/details/53 ...

  9. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx

    PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...

最新文章

  1. 初中信息技术说课python_第一单元 走进Python 编程世界
  2. 年度BCI奖 |THE ANNUAL BCI AWARD
  3. linux设备驱动之pci设备的驱动架构
  4. android中如何实现UI的实时更新---需要考虑电量和流量
  5. rm: cannot remove directory `test': Permission denied
  6. java安全编码指南之:死锁dead lock
  7. 客户端到服务器的请求响应时间,客户端到服务器的网络响应时间
  8. python快捷方式图标_python – PyInstaller无法更改快捷方式图标
  9. Python 第三方模块之 matplotlib - 绘图库
  10. 学习 | Spring Cloud Config 从入门到精通
  11. linux 4 内核 c,4. 使代码正确 — The Linux Kernel documentation
  12. 【Elasticsearch】Elasticsearch 缓存策略 QueryCacheingPolicy
  13. visual stdio 工程 宏
  14. C#中==操作符存在的缺陷
  15. JavaScript中JSON的处理心得
  16. python exec函数_Python3
  17. 3G dual band 使用策略
  18. java实践体会,java实践心得体会范文3篇
  19. win10北通手柄没反应_【游戏手柄攻略】WIN10怎样校准和设置游戏手柄
  20. 基于Java科研项目申报管理系统

热门文章

  1. filetype 在搜索引擎中的使用方法(2)
  2. POJ 1155 TELE【树形DP】
  3. 笑话(12) 内裤都磨破了
  4. java算法之希尔排序
  5. usb连接不上 艾德克斯电源_硬核充电宝?360汽车应急电源入手体验
  6. Python提取彩色图像的二值化边缘
  7. python比较文件每行长度_读取文件并查找所有行的长度是否相同
  8. php判断平年和闰年,平年和闰年的三种判断方法
  9. java post 403_求助啊。。。。。。给服务器POST JSON报403
  10. 718. 最长重复子数组(JavaScript)