生成随机序列的算法c语言,一个C语言编写的不重复随机序列算法
一个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语言编写的不重复随机序列算法相关推荐
- C语言 一个 long long 数字转 char 字符串的算法
哈哈哈哈破案了 最新解法:格式化IO sprintf(str, "%lld", lli); 下面这做法现在看一次笑一次哈哈哈 工作需要,但是C语言标准库里没有这个,所以自己实现. ...
- shuffle洗牌算法java_js打乱一个数组 的 洗牌(shuffle )算法
写php的时候 有个shuffle 函数很爽很好用,但是js要实现同样算法的时候发现没有现成函数,在网上看了大量的例子,觉得不靠谱所以,自己写了一个,其实非常简单,以下是实现代码 var shuff ...
- 冒泡排序c语言子程序,C语言之冒泡排序算法
一.搭建Zookeeper集群Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务--分布式同步(DistributedSynchronization) ...
- 熟悉c语言,熟悉c语言编程环境.ppt
熟悉c语言编程环境.ppt 程序设计基础 C语言程序设计,主讲朱海燕 gxzhy2003,课程性质 专业必修课 课程类型 理论课(3/5),含实践(2/5) 学分 3.5学分 学时(周学时) 85学时 ...
- python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析
本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...
- php 实现的字典序排列算法,字典序的一个生成算法
字典序的一个生成算法. 最近在LeetCode刷题,刷到一个题,链接: https://leetcode-cn.com/problems/permutation-sequence/ 这个题要求得长度为 ...
- C语言第一行是1第二行是1和2,【C语言】第一个C语言小程序 —— 日期算法和万年历 2...
1. 上一篇我们只完成了 a. 算出某年某月某日是星期几 b. 打印出某年某月的日历 这一次我写了一个打印某一年的日历.一开始我是不打算写的,因为可以调用之前的方法,分别打印出这一年12个月的日历.但 ...
- 一个借鉴现代OS的MMU的排序算法
很久很久以前,我写过两篇文章,关于一个突然想出来的点子整合出来的一个排序算法: 移位排序算法–从赛跑想到的:http://blog.csdn.net/dog250/article/details/53 ...
- 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx
PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...
最新文章
- 初中信息技术说课python_第一单元 走进Python 编程世界
- 年度BCI奖 |THE ANNUAL BCI AWARD
- linux设备驱动之pci设备的驱动架构
- android中如何实现UI的实时更新---需要考虑电量和流量
- rm: cannot remove directory `test': Permission denied
- java安全编码指南之:死锁dead lock
- 客户端到服务器的请求响应时间,客户端到服务器的网络响应时间
- python快捷方式图标_python – PyInstaller无法更改快捷方式图标
- Python 第三方模块之 matplotlib - 绘图库
- 学习 | Spring Cloud Config 从入门到精通
- linux 4 内核 c,4. 使代码正确 — The Linux Kernel documentation
- 【Elasticsearch】Elasticsearch 缓存策略 QueryCacheingPolicy
- visual stdio 工程 宏
- C#中==操作符存在的缺陷
- JavaScript中JSON的处理心得
- python exec函数_Python3
- 3G dual band 使用策略
- java实践体会,java实践心得体会范文3篇
- win10北通手柄没反应_【游戏手柄攻略】WIN10怎样校准和设置游戏手柄
- 基于Java科研项目申报管理系统