如何获得限定数量,限定数字范围的随机数

dingjin_dj 2012-03-21 04:14:40
现在我需要在一个数据集中选择一定数量的记录集,

随机数的选取范围就是数据集中的ID,每条记录ID不重复,但可能是不连续的,比如是1,2,4,6,7,

选取的数量根据需要设定。


但是我真的是个小白,不知怎么搞。

第一:怎么设定随机数选择的范围,让获得的结果在已有的ID值之中,既不能有重复,也不能发生选择的随机数没有对应的ID。

第二:怎么提高效率,一次性的选择完成。

最好能有例子或者代码,万谢。
...全文
240 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-03-21
  • 打赏
  • 举报
回复
随机必然有重复,所谓“不重复的随机”实际上是洗牌。
#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");
}
}
}

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
return (
(((unsigned long)rand()<<24)&0xFF000000ul)
|(((unsigned long)rand()<<12)&0x00FFF000ul)
|(((unsigned long)rand() )&0x00000FFFul));
}
int i;
unsigned long ul;
void main() {
srand(time(NULL));
for (i=0;i<10;i++) {
ul=ulrand();
printf("%010lu 0x%08x\n",ul,ul);
}
}
//2337588057 0x8b54c359
//1977377429 0x75dc6295
//3607316769 0xd7034921
//0009828482 0x0095f882
//3350859779 0xc7ba1003
//0945794621 0x385fae3d
//3400869024 0xcab524a0
//3097846779 0xb8a563fb
//4287421124 0xff8cdac4
//3934016258 0xea7c5302
dingjin_dj 2012-03-21
  • 打赏
  • 举报
回复
顺序倒是无所谓,但是现在不知道ID值的范围,我只是举个例子
SuperLy 2012-03-21
  • 打赏
  • 举报
回复
如果选出的比较多,还可以这个算法:
把数组作N次扰乱处理(就是随机交换位置,越乱越好),然后顺序选需要的个数即可。
SuperLy 2012-03-21
  • 打赏
  • 举报
回复
把已经选出来的作个标记,
下次随机的时候,随机数最大范围-1,同时跳过所有已标记的就是。
qixing1115 2012-03-21
  • 打赏
  • 举报
回复
rand()%7
rand()%6
rand()%5
.....

选一个就少一个,当然这里rand()出来的数要处理一下,比如第一次是5,第二次还可以是5,就用7代替5,因为第二次不可能出7了

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧