user-0 提问: 书上的习题，求个思路

回复:
user: user-1
content: 引用 12 楼 guicaisa 的回复:[quote=引用 10 楼 anshiny 的回复:] #include <stdio.h> #include <stdlib.h> #include <time.h>  int main( ) {     int data[10] = { 12, 9, 8, 7, 6, 2, 5, 3, 10, 15}; // 10个数     int choo[10]; // 选中     int i, k = 0, temp;      srand(time(NULL)); // 随机种子      for(i=0; i<5; i++) {         int r = rand() % (10 - i);         choo[k++] = data[r]; 		temp = data[r]; 		data[r] = data[9-i]; 		data[9-i] = temp;     }      printf("Result: "); // 打印结果     for(i=0; i<5; i++) {         printf("%d ", choo[i]);     } 	return 0; }  有种眼前一亮的感觉，，感谢。。[/quote]  anshiny's code looks great! I don't want to be a dick here but I suspect its correctness in terms of "even distribution". Knuth's vol 2 has an implementation for this case and it comes with the probabilistic proof. That has been said, Knuth's algorithm will be slower than anshiny's since it requires a loop against the entire candidate list. Just want to point out here, in case someone is interested...

user: user-2
content: 引用 16 楼 micropentium6 的回复:[quote=引用 12 楼 guicaisa 的回复:] [quote=引用 10 楼 anshiny 的回复:] #include <stdio.h> #include <stdlib.h> #include <time.h>  int main( ) {     int data[10] = { 12, 9, 8, 7, 6, 2, 5, 3, 10, 15}; // 10个数     int choo[10]; // 选中     int i, k = 0, temp;      srand(time(NULL)); // 随机种子      for(i=0; i<5; i++) {         int r = rand() % (10 - i);         choo[k++] = data[r]; 		temp = data[r]; 		data[r] = data[9-i]; 		data[9-i] = temp;     }      printf("Result: "); // 打印结果     for(i=0; i<5; i++) {         printf("%d ", choo[i]);     } 	return 0; }  有种眼前一亮的感觉，，感谢。。[/quote]  anshiny's code looks great! I don't want to be a dick here but I suspect its correctness in terms of "even distribution". Knuth's vol 2 has an implementation for this case and it comes with the probabilistic proof. That has been said, Knuth's algorithm will be slower than anshiny's since it requires a loop against the entire candidate list. Just want to point out here, in case someone is interested...[/quote]你说的这鸟语人家听得懂吗？

user: user-3
content: 第一次从0-9随机的取一个数，作为索引，该索引之后的值，依次前移，索引处的值即为此次取到的值，并将该值移动到数组的最后一个位置。 以后每次随机数的范围减一，比如第二次0-8，第三次0-7......直到取完所有的数。  该方法的最大好处是数组长度可以随意变化，所取数的个数也不受限制，并且只要一个循环就可完成。

user: user-4
content: 我也做过

user: user-5
content: 10楼666666

user: user-5
content: 我也遇到这个问题我的那个是6合菜

user: user-0
content: 引用 10 楼 anshiny 的回复:#include <stdio.h> #include <stdlib.h> #include <time.h>  int main( ) {     int data[10] = { 12, 9, 8, 7, 6, 2, 5, 3, 10, 15}; // 10个数     int choo[10]; // 选中     int i, k = 0, temp;      srand(time(NULL)); // 随机种子      for(i=0; i<5; i++) {         int r = rand() % (10 - i);         choo[k++] = data[r]; 		temp = data[r]; 		data[r] = data[9-i]; 		data[9-i] = temp;     }      printf("Result: "); // 打印结果     for(i=0; i<5; i++) {         printf("%d ", choo[i]);     } 	return 0; }  有种眼前一亮的感觉，，感谢。。

user: user-6
content: #include <vector> #include <algorithm> #include <random> using namespace std; int main(void) { 	//采用c++11标准编写 	int data[10] = { 12, 9, 8, 7, 6, 2, 5, 2, 10, 15 }; // 10个数 	vector<int>v(begin(data), end(data));//保存到容器 	sort(begin(v), end(v));//排序 	v.erase(unique(begin(v), end(v)), end(v));//删除重复数字 	default_random_engine e;//随机数引擎 	for (int i = 0; i < 5;i++) 	{ 		uniform_int_distribution<unsigned> u(0, v.size());//生成0-v.size()的随机数 		int n = v[u(e)];//得到随机数 		cout << n << endl; 		v.erase(find(begin(v),end(v),n));//从容器删除已经打印出的随机数 	}		 	     return 0; }

user: user-7
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  int main( ) {     int data[10] = { 12, 9, 8, 7, 6, 2, 5, 3, 10, 15}; // 10个数     int choo[10]; // 选中     int i, k = 0, temp;      srand(time(NULL)); // 随机种子      for(i=0; i<5; i++) {         int r = rand() % (10 - i);         choo[k++] = data[r]; 		temp = data[r]; 		data[r] = data[9-i]; 		data[9-i] = temp;     }      printf("Result: "); // 打印结果     for(i=0; i<5; i++) {         printf("%d ", choo[i]);     } 	return 0; }

user: user-8
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  void main( ) { 	int data[10] = { 12, 98, 9, 89, 8,  878, 87, 23, 45, 235 }; // 10个数 	int flags[10] = {0}; // 哪些数被选中 	int i, k;  	srand(time(NULL)); // 随机种子  	for(i=0; i<5; i++) 	{ 		int count = 0;  		int r = rand() % (10 - i) + 1;	 		printf("random: %d \n", r);  		for(k=0; k<10; k++) 		{ 			if(flags[k]) continue; 			 			if(++count == r) 			{ 				flags[k] = 1; 				break; 			} 		} 	}  	printf("Result: "); // 打印结果 	for(i=0; i<10; i++) 	{ 		if(flags[i])  			printf("%d ", data[i]); 	}	 }

user: user-9
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-10
content: 随机数用于做序号，用数组保存10个数。数被抽取后，该位置写-1，下次抽取的时候，发现是-1.，那么从新抽取，直道5个数

user: user-8
content: 另一种办法是：第一次在0~9之间取一个数，第二在0~8之间取一个数，。。。。。   引用 2 楼 qq530370925 的回复:你再定义一个5个元素的数组，第一次随机抽取，然后放到这个数组里去，第二次随机抽取，和第一个做判断，如果相等，不存入，不相等就存入，然后第三次随机，抽出来的再和那两个做判断，就这样五次。

user: user-11
content: 你再定义一个5个元素的数组，第一次随机抽取，然后放到这个数组里去，第二次随机抽取，和第一个做判断，如果相等，不存入，不相等就存入，然后第三次随机，抽出来的再和那两个做判断，就这样五次。

user: user-12
content: 这个是逻辑题吧？万一十个数都一样呢？？个人感觉~