QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2837|回复: 23

很菜的问题,c怎么产生不重复的随机数!

[复制链接]
发表于 2004-7-21 11:05:29 | 显示全部楼层 |阅读模式
如题
0到9的整数为例
谢谢了
发表于 2004-7-21 14:01:42 | 显示全部楼层
楼主应该利用搜索(我这个版主就这样撑下来的 )看附件。
(有几个pascal写的,我看了觉得用c也行)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2004-7-21 20:52:14 | 显示全部楼层
啊^_^
高明
不过今天我想了一下写了一个c程序贴出来看看,指教指教!
[code:1]
#include <stdio.h>
#include <time.h>

main()
{
        int a[10],i,j,temp;
        srand(time(NULL));
        a[0]=1+rand()%10;
        for(i=0;i<9;)
        {
                temp=1+rand()%10;
                for(j=0;j<=i;j++)
                  if(a[j]==temp)
                    break;
                if(j>i)
                {
                        a[j]=temp;
                        i++;
                }
         }
        for(i=0;i<10;i++)
        printf("%d  ",a[i]);
        printf("\n");
}
[/code:1]
不过总是不甘心,好像不太稳定,如果上帝不给面子那就可能要比较多的时间消耗了,还是得去google
斑竹sagaeon的mozilla挺漂亮的,我怎么美化都搞不到这个样子,郁闷啊,按钮总是方块状的,听说要什么gtk1的主题,怎么回事啊? 我的窗口的样子倒是和斑竹的差不多
回复

使用道具 举报

发表于 2004-7-21 22:05:23 | 显示全部楼层
我ft,让你看搜索内容你倒关心起我的界面来了   
ps:这是Mac-os主题,从网上下的。
回复

使用道具 举报

发表于 2004-7-21 23:21:04 | 显示全部楼层
在使用随机数之前设置随机种子即调用srand(time(NULL))是正确的作法,0到9的随机数可以用以下语句:
(int)(9.0*rand()/(RAND_MAX+1.0))

当然也可以用其它技巧实现随机数,如以下代码:
[code:1]
static unsigned long k=-1;  /* 全局变量 */

void unsigned startnum(unsigned int seed)
{
  k=seed;
}

unsigned randnum(long n)
{
  k=((k*159+23)%n)+1;
  return k;
}

[/code:1]

这就是用户自定义的开始设置随机数种子和使用随机数的代码。
回复

使用道具 举报

 楼主| 发表于 2004-7-22 09:43:24 | 显示全部楼层
谢谢关心、指教!  
回复

使用道具 举报

发表于 2004-7-23 20:01:33 | 显示全部楼层
正好知道而已。别的我还真不会  
回复

使用道具 举报

发表于 2004-7-24 14:58:00 | 显示全部楼层
[quote:a72538d204="lanche"]正好知道而已。别的我还真不会  [/quote]又抢我台词   
回复

使用道具 举报

发表于 2004-7-28 20:33:04 | 显示全部楼层
for each x { 0<x<1 &&  x !=1/2 } ,   then

x=x*(1-x)*2 is chaos between 0 and 1;
回复

使用道具 举报

发表于 2004-7-28 21:58:16 | 显示全部楼层
楼上的不对哦 :-)
回复

使用道具 举报

发表于 2004-7-28 23:48:47 | 显示全部楼层
楼主的意思好像不是单纯要产生范围在[0,9]之间的随机整数, 而且要使得这个序列中的各个数之间不重复. 我理解的对吗, 楼主?

如果是这样,  那么楼主上面的代码就不太高明, 主要在碰运气了

可以这样做:
[1] 设置一个数组 a[N], 并赋值 a[0]=0, a[1]=1, ..., a[N-1]=N-1.
[2] 令m=N.
[3] 产生一个0到m之间(不包括m)的随机整数i, 取出a加入目标随机序列, 执行a=a[--m].
[4] 重复第[3]步最多N次, 就可以得到一个没有重复的随机序列.
回复

使用道具 举报

发表于 2004-7-29 22:42:51 | 显示全部楼层
thinker007的原意可能是未设置随机数种子时每次从头产生随机数都会发现所产生的序列很固定,所以我才那样回答。

或是按lapackapi的那种说法,则用产生彩票的算法,那方法却又更多了。
回复

使用道具 举报

 楼主| 发表于 2004-7-30 22:53:37 | 显示全部楼层
lapackapi的理解正是我意
但是做法不是很理解,能写出代码来看看么?谢谢!
回复

使用道具 举报

发表于 2004-7-30 23:05:48 | 显示全部楼层
哦?要真这样是我会错意了。那你可以用产生彩票类似的算法来生成随机序列。
回复

使用道具 举报

 楼主| 发表于 2004-7-30 23:10:16 | 显示全部楼层
呵呵,利用time作为随机数种子我是知道,lanche的代码也知道了另外一种设置随机数种子的办法,也不差啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 13:48 , Processed in 0.067980 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表