如何获得限定数量,限定数字范围的随机数
现在我需要在一个数据集中选择一定数量的记录集,
随机数的选取范围就是数据集中的ID,每条记录ID不重复,但可能是不连续的,比如是1,2,4,6,7,
选取的数量根据需要设定。
但是我真的是个小白,不知怎么搞。
第一:怎么设定随机数选择的范围,让获得的结果在已有的ID值之中,既不能有重复,也不能发生选择的随机数没有对应的ID。
第二:怎么提高效率,一次性的选择完成。
最好能有例子或者代码,万谢。
[解决办法]
rand()%7
rand()%6
rand()%5
.....
选一个就少一个,当然这里rand()出来的数要处理一下,比如第一次是5,第二次还可以是5,就用7代替5,因为第二次不可能出7了
[解决办法]
把已经选出来的作个标记,
下次随机的时候,随机数最大范围-1,同时跳过所有已标记的就是。
[解决办法]
随机必然有重复,所谓“不重复的随机”实际上是洗牌。
#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"); } }}