c语言如何产生随机数(不重复)

fengyupiaoyao 2007-05-13 02:27:21
谢谢各位了。。。
...全文
2392 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsxxiaohao 2012-06-06
  • 打赏
  • 举报
回复
这个随即数也有可能是有重复的。
天台的故事 2012-06-05
  • 打赏
  • 举报
回复
先用srand();
再用rand();就可以,
两个函数看看msdn
Kaile 2012-06-05
  • 打赏
  • 举报
回复
在0到__int64范围内取随机数,重复可能性很小
aiqingdejian 2012-06-05
  • 打赏
  • 举报
回复
记得以前刚学的时候用的是rand();
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
随机必然有重复,所谓不重复的随机根本就不是随机,而是洗牌。
洗牌算法请参考下面
#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");
}
}
}
牙牙学语 2012-06-05
  • 打赏
  • 举报
回复
你是要伪随机还是真随机呀
LBSGG 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 10 楼 的回复:

C/C++ code


srand(NULL);
for(int i=0; i!=1000; i++)
{
int num = rand()%10000;
printf("%d ",num);
}


rand()产生的是假随机数字,每次执行时产生的结果是相同的
[/Quote]

除非你每次使用时都利用srand()设置不同的随机数种子
LBSGG 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

C/C++ code


srand(NULL);
for(int i=0; i!=1000; i++)
{
int num = rand()%10000;
printf("%d ",num);
}
[/Quote]

rand()产生的是假随机数字,每次执行时产生的结果是相同的
jiandingzhe 2012-06-05
  • 打赏
  • 举报
回复
或者你看看这个,周期可能很大。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
jiandingzhe 2012-06-05
  • 打赏
  • 举报
回复
读系统的真随机数设施。unix下应当有/dev/random。但是很慢。
tm1mc2 2012-06-05
  • 打赏
  • 举报
回复
利用消息结构的成员tagMSG.time,它是一个以毫秒为单位的时间,32位,40亿毫秒,约46天。
每一下击键,产生一个数,46天内不会重复。
nice_cxf 2012-06-04
  • 打赏
  • 举报
回复
不重复那就不叫随机数了。。。
虽说电脑的随机数做不到完全随机。。。
IVERS0N 2012-06-04
  • 打赏
  • 举报
回复


srand(NULL);
for(int i=0; i!=1000; i++)
{
int num = rand()%10000;
printf("%d ",num);
}

Pis117435947 2012-06-04
  • 打赏
  • 举报
回复
一般只要srand()一下保证每次都不重复然后rand()一下就ok了
海浪51 2007-05-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int main()
{
int num[50],N=10;

num[0]=rand();
for(int x=1;x<N;x++)
{
A: ;
num[x]=rand();
for(int y=0;y<x;y++)
if(num[y]==num[x])
goto A;
}

for(int x=0;x<N;x++)
printf("%d\n",num[x]);
system("PAUSE");
return 0;
}
spofmy 2007-05-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <timeb.h>
/*返回随机数序列初值*/
double Initial()
{
double init;
struct timeb *tmb;
while(1)
{
ftime(tmb);
/*利用DOS系统的时钟产生随机数序列初值*/
init=tmb->millitm*0.9876543*0.001;
if(init>=0.001)
break;
}
return init;
}
/*返回一个(0,1)之间的随机数*/
double Random(void)
{
static double rndm=-1.0;
if(rndm==-1.0)
rndm=Initial();
else
rndm=3.80*rndm*(1.0-rndm);
return rndm;
}
int main()
{
double randnum;
int i;
clrscr();
puts("*********************************************");
puts("| This program can generate a random number |");
puts("| Press 'q' to quit |");
puts("| Press any other key to generate |");
puts("*********************************************");
while(1)
{
if(getch()=='q')
break;
randnum = Random();
printf ( "\n >> the randnum is:%f\n",randnum );
}
return 0;
}
BlackPointofSun 2007-05-13
  • 打赏
  • 举报
回复

年+月+日+时+分+秒

20070513235107
hfm525 2007-05-13
  • 打赏
  • 举报
回复
你意思都没说清楚....
Jokar 2007-05-13
  • 打赏
  • 举报
回复
这个要看你需要使用多少次了,无限次的不重复是不可能的
fengyupiaoyao 2007-05-13
  • 打赏
  • 举报
回复
先前就是用楼上的,有很多重复。。。。
加载更多回复(2)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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