打印

c51求随机数产生及剔除 的算法?

[复制链接]
3427|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
doob|  楼主 | 2009-11-9 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void mySrand()
{

srand(TL2);
}

UINT8 myRandNum()
{
static UINT8 pre_rand;
UINT8 rand_num;
UINT16 tmp1;

tmp1=rand();
rand_num=tmp1%100;
  pre_rand=rand_num;
return rand_num;
}

但我想把已经产生的随机数,下次不再产生,不知
如何剔除呢?
譬如:第一次随机数3,以后就不能产生3。。。
这样做就是为了保证100次内,100个数字轮一遍;
谢谢!

相关帖子

来自 2楼
mohanwei| | 2009-11-9 16:50 | 只看该作者
void StartNewGame()
{
        CArray<int,int> List;                                //
        int i;

        //给数组赋值
        for(i=0;i<100;i++)
        {
                List.Add(j);
        }

        srand((unsigned)time( NULL ));//随机数喂种子
        while(1)
        {       
                int size=List.GetSize();//剩余牌数
                if(size==0)
                        break;
                //取得一个随机数
                i=(rand()*rand())%size;
                //处理该数
                //……
                List.RemoveAt(i);//删除该数
        }
}
思路很简单,看代码……
(rand()*rand())%size表示在0-size之间取一个随机数。
第一次在100个数之间随机取一个,第二次在99个数之间随机取一个,第三次在98个数之间随机取一个……而取出来的数被删掉,所以之后都不会再出现。

使用特权

评论回复
板凳
程序匠人| | 2009-11-9 16:00 | 只看该作者
要么就做一个伪随机数表
要么就开一个数组**下每次产生的随机数,以后再产生的数都去和这个数组的每一个值比对,如果相同就重新运算,直到产生新数。

使用特权

评论回复
地板
李冬发| | 2009-11-9 21:14 | 只看该作者
不会吧,匠人也犯LS的错呢?

使用特权

评论回复
5
程序匠人| | 2009-11-9 21:59 | 只看该作者
不会吧,匠人也犯LS的错呢?
李冬发 发表于 2009-11-9 21:14

啊?没看出来

使用特权

评论回复
6
不亦心| | 2009-11-9 22:13 | 只看该作者
学习ing

使用特权

评论回复
7
mohanwei| | 2009-11-10 08:26 | 只看该作者
没看清是C51……可能要换别的方法了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

1113

帖子

3

粉丝