随机数与随机分组

在C语言中通常用srand()与rand()函数来去随机数;

 在c语言里面,两个函数包含在<stdlib.h>头文件里面,c++里面,标准库<cstdlib>(被包含于<iostream>中).

 srand函数是随机数发生器的初始化函数。

        原型:void srand(unsigned seed);

        rand函数用来产生随机数,当然是伪随机数

       原型:int rand(void)

       seed的作用:srand函数的作用是根据参数seed,设置一个随机起始点,而rand函数根据这个起始点,产生随机数序列。默认的随机种子为1。如果随机种子一样,rand函数所产生的随机序列也一样。
       因此,为使每次程序运行都能产生不同的随机序列,每次都应产生一个不同的种子参数

 

说明

       因为rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。

      返回值:
      返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。

       0~RAND_MAX每个数字被选中的机率是相同的。

技巧 1: 
若要产生指定范围内的随机整数例如 [a, b) 则可以使用: a + rand() % (b - a) 表达式,也即为要产生 [a, b)范围内的随机整数,可以使用 a + rand() % n 表达式,其中 a 为起始值, n 为随机整数取值范围的大小即为 b - a 

技巧 2 : 
如要产生随机小数,直接将产生的随机整数除以相应次数的10,例:若产生3位的随机小数,则先产生随机整数,然后除以1000即可

 

实例:

产生1-100以内的随机数

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

int main()
{
    srand((unsigned)time(NULL));
    printf("%d\n",rand()%100 );
    return 0;
}

 

随机分组

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
	const char *name[] = {
			"1",
			"2",
			"3",
			"4",
			"5",
			"6",
			"7",
			"8",
			"9",
			"10",
			"11",
			"12",
			"13",
			"14",
			"15",
			"16",
			"17",
			"18",
			"19",
			"20",
			"21",
			"22",
			"23",
			"24",
			"25",
			"26",
			"27",
			"28",
			"29",
			"30",
			"31",
			"32",
			"33",	
			"34",
			"35",
			"36",
			"37",
	};
 
	int len = sizeof(name)/sizeof(name[0]);
	int i;
	int last = len-1; 
	srand((unsigned int)time(NULL));//用法固定与rand()一起产生一个随机数
	for (i = 0; i < len; i++)
	{
		int index = rand()%(len);
		// 交换
		const char *tmp = name[index];
		name[index] = name[last];
		name[last] = tmp;
		last--;
	}
	// 打印
	for (i = 0; i < len; i++)
	{
		if (i % 4 == 0)
			printf ("\n");
 
		printf ("%8s", name[i]);
	}
 
	printf ("\n");
	
	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值