user-0 提问: 产生0-9之间的不同的随机数，为什么这种循环两次会出现相同的数字呢？？？求解

回复:
user: user-1
content: 引用 19 楼 destory27 的回复:计算机随机数并不是所谓正真的随机数，是根据随机数种子产生的看似随机的东西，如果没有修改随机数种子，那产生的数就一样   和上边回答重了

user: user-1
content: 计算机随机数并不是所谓正真的随机数，是根据随机数种子产生的看似随机的东西，如果没有修改随机数种子，那产生的数就一样

user: user-2
content: （伪）随机数的一种实现，mysrand和myrand代码参考VS源代码做了简化：  #include <stdio.h>  unsigned long rand_seed=1;  void mysrand(unsigned int seed) { 	rand_seed=(unsigned long)seed; }  int myrand(void) {  /* rand_seed每次迭代为新的值 */ 	return( ((rand_seed = rand_seed * 214013L             + 2531011L) >> 16) & 0x7fff ); }  int main() { 	int i; //	mysrand((unsigned)time(NULL)); 	for(i=0;i<10;i++) 		printf("%d\t",myrand()%100); 	return 0;	     }

user: user-3
content: #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main(void) {         srand(time(NULL));     for (int h=0;h<3;h++)     {         int a[5], aa[5] = {0}, i;         for (i = 0;i < 5;)             if (aa[i] == 0)             {                 a[i] = rand() % 10;                 //cout<<"a[i] = "<< a[i]<<endl;                 aa[i]++;                 i++;    //保证每个都能获取一个随机值             }           for (i = 0;i < 5;i++)             cout << a[i] << "," << "\t";         cout<<endl;     }     cout << endl;      return 0; }  若想保证每个数组元素都获得一个随机值，建议将i++放在if判断体内；

user: user-4
content: 随机必然有重复，所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面： #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

user: user-0
content: /* 保证5次结果的每组3个均不同，并且这5次的结果也应该不同*/  #include <iostream> using namespace std;  void DE(int i) { 	int  aa[100],h = 100,m,x,y,j,k,xr[3];  	for (k=0;k<5;k++)   // 保证5次结果的3组数字都应该不同 	{    	for (m = 0;m<100;m++) 		aa[m] = m;  	for (y = i;y< h - 1;y++)   // 删除第i个元素,这样数组中就没有i元素，可以保证与xr[0]、xr[1]、xr[2]不重复 		aa[y] = aa[y + 1];  		h--;     	for (x = 0;x <3;x++)     //每组3个数组都不应该相同 	{ 		int g = rand() % h; 		xr[x] = aa[g];  		for (y =aa[g] ;y < h - 1;y++)     //删除当前xr[x]元素，保证xr[0]、xr[1]。、xr[2]不相同 			aa[y] = aa[y + 1]; 			h--; 		 	} 	  	for (x = 0;x < 3;x++) 		cout << xr[x] << "," << "\t"; 		cout << endl;  	} } int main(void) { 	for (int h = 0;h < 1;h++)  // 运行3次 		DE(2);      //  调用函数，保证2与产生的每组随机数不一样 	return 0; }  这样还是不行

user: user-5
content: 引用 13楼赵4老师 的回复:[quote=引用 12 楼 iloveyou418 的回复:] 因为计算机不存在真正的随机数，要保证两次出现的不一样需要做srand处理 概念错误！真正的随机是两次出现也有一样的。比如扔硬币这种真正的随机。[/quote]好吧好吧-

user: user-2
content: 其实楼主有空可以找到VS安装目录，查看一下rand和srand的源代码，比较明了。

user: user-0
content: 如果不使用srand()这个函数，直接通过数组标记。每次运行5次，每次的运行结果都不一样，保证5次中的每组三个数字都应该不同，我想想这样编写还是不对。，请大家看看。 #include <iostream> using namespace std;  void DE(int i) { 	int  aa[100],h = 100,m,x,y,j,k,xr[3];  	for (k=0;k<5;k++)   // 保证5次结果的3组数字都应该不同 	{  	for (m = 0;m<100;m++) 		aa[m] = m;  	for (y = i;y< h - 1;y++) 		aa[y] = aa[y + 1];  		h--; 	for (x = 0;x <3;x++)     //每组3个数组都不应该相同 	{ 		int g = rand() % h; 		xr[x] = aa[g];  		for (y = i;y < h - 1;y++)     //剔除 i元素   			aa[y] = aa[y + 1]; 			h--;	 	}   	for (x = 0;x < 3;x++) 		cout << xr[x] << "," << "\t"; 		cout << endl;  	} } int main(void) { 	for (int h = 0;h < 3;h++)  // 运行3次 		DE(2);      //  调用函数，保证2与产生的每组随机数不一样 	return 0; }    计算结果截图  ：

user: user-4
content: 引用 12 楼 iloveyou418 的回复:因为计算机不存在真正的随机数，要保证两次出现的不一样需要做srand处理 概念错误！真正的随机是两次出现也有一样的。比如扔硬币这种真正的随机。

user: user-5
content: 因为计算机不存在真正的随机数，要保证两次出现的不一样需要做srand处理

user: user-4
content: 用例

user: user-4
content: 引用 8 楼 u010165006 的回复:@zhao4zhong1 老赵洗个牌为什么这么复杂？ 自带测试用列而已。

user: user-2
content: @program_Three3 如果不用srand((unsigned)time(NULL)); 这条语句该怎么操作 —————— 用GetTickCount来初始化随机数种子应该也可以。

user: user-2
content: @zhao4zhong1 老赵洗个牌为什么这么复杂？

user: user-6
content: https://www.cnblogs.com/fencao/p/6131634.html

user: user-6
content: 使用rand前需要先调用srand对初始化

user: user-0
content: 如果不用srand((unsigned)time(NULL)); 这条语句该怎么操作，

user: user-2
content: srand((unsigned)time(NULL)); //用当前时间初始化随机数种子 参考： C++/C语言rand()和srand()函数产生伪随机数 http://blog.163.com/tab_98/blog/static/11924097201772931815266/

user: user-7
content: 先调用srand函数