C语言生成随机数

1、关于C语言中有rand()函数来产生随机数,但是初始seed为1,这样做有一个问题,即会产生固定序列的数,比如单独调用rand()时会产生

1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421…

即使在其他进程中执行也会得到相同的序列;如果得到的数据可以预测,那么就不是真正的随机数了,因为你永远不知道你掷色子的下一次是什么数;为了避免这种“尴尬”的随机数生成方式,需要使用不同的seed;

一般实现方法是通过srand(unsigned seed)来设置,通常使用time()函数作为seed参数

使用形式:srand((unsigned)time(NULL));

2、关于生成[start_num, end_num]的随机数

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

int main(int argc, char *argv[]) 
{ 
	int i;
	unsigned start_num;
	unsigned end_num;
	
	if (argc != 3)
	{
		printf("please input start num and end num! argc: %d\n", argc);
		return -1;
	}
	
	start_num = atoi(argv[1]);
	end_num = atoi(argv[2]);
	
	if (start_num >= end_num)
	{
		printf("invalid args!\n");
		return -1;   
	}
	
	srand((unsigned)time(NULL));
	
	for(i = 0; i < end_num - start_num + 1; i++) 
		printf("%d ", rand() % (end_num - start_num + 1) + start_num); 
	
	printf("\n");
	
	return 0; 
}

3、关于生成不重复[start_num, end_num]的随机数

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

int main(int argc, char *argv[]) 
{ 
	int i, temp, rand_index;
	unsigned start_num;
	unsigned end_num;
	int *a = NULL;
	
	if (argc != 3)
	{
		printf("please input start num and end num! argc: %d\n", argc);
		return -1;
	}
	
	start_num = atoi(argv[1]);
	end_num = atoi(argv[2]);
	
	if (start_num >= end_num)
	{
		printf("invalid args!\n");
		return -1;   
	}
	
	srand((unsigned)time(NULL));
	
	a = (int *)malloc((end_num - start_num + 1) * sizeof(int));
	
	for (i = start_num; i < end_num + 1; i++)
	{
		a[i - start_num] = i;
	}

	for (i = start_num; i < end_num + 1; i++)
	{
		temp = a[i - start_num];
		rand_index = rand() % (end_num - start_num + 1);
		a[i - start_num] = a[rand_index];
		a[rand_index] = temp;
	}
	
	for(i = 0; i < end_num - start_num + 1; i++) 
		printf("%d ", a[i]); 
	
	printf("\n");
	
	free(a);
	
	a = NULL;
	
	return 0; 
}

其中最主要的算法是:首先生成一个从[start_num, end_num]的数组,这样就会保证数组里面的数不会重复,那么如何使这个数组的排好的序随机呢?这里的解决办法是使用rand()来生成一个随机数组序号,使用自增的方式遍历整个数组,然后交换rand()生成的随机数组序号的a[rand_index]和当前的a[i - start_num],实际上就类似于随机拿一个排好序的序列中的一个数和序列中另一个数交换位置,这样序列就被随机打乱,随机交换的次数当然也可以随机;序列中的数值是不会变的(即不重复);如此便能实现不重复随机数序列;

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值