VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 3784|回复: 7

vc怎样产生0-10000000的随机数

[复制链接]
发表于 2015-5-27 10:17:12 | 显示全部楼层 |阅读模式
就这个而言,远没有vb方便快捷!
vc怎样产生0-10000000的随机数?有谁有现成的算法。
网上找了一个,好像并不行!
/*
     * a[]: 放置随机数的起始地址
     * size:要产生的随机数的个数(数组大小)
     * start:要产生的随机数n的范围,大于等于start  
     * end:  要产生的随机数n的范围,小于end
     */  
    void rand_gen(int a[], int size, int start, int end )  
    {  
        int n,i,k ;  
        int ok = 1;  
         
        for( i = 0; i<=size-1; i++ )  
        {  
            //如果n与a[0]到a[i-1]的任何值有重复,  
            //就一直产生随机数,直到不重复  
            while(1)  
            {  
                n = rand() % (end-start) + start ;  
                ok = 1; //假设不重复  
                  
                //从a[0]到a[i-1],检测是否有重复  
                for(k=0; k<= i-1; k++ )  
                {  
                    if( a[k] == n )  
                    {  
                        ok = 0;  
                        break; //检测到重复  
                    }  
                }     
      
                if( ok )   
                {  
                    a[i] = n; //没有重复,把n放入数组  
                    break ;   
                }  
            }//退出do while,继续第i+1个随机数  
        }  
    }  

点评

(int)((float)rand()*10000000.0f/(float)RAND_MAX) 不就完了,不过我先提醒你,rand精度不够,不足以生成0-10000000的随机数,VB6那个Rnd()也是一样的  发表于 2015-5-27 13:40
发表于 2015-5-27 12:32:05 | 显示全部楼层
简单点就...
rand()*rand()%10000000

点评

一般a%b 如果a是均匀分布且a>>b应该就近似均匀分布了吧?  发表于 2015-5-30 08:59
直接对你表示无语  发表于 2015-5-28 12:51
从来不管均匀不均匀,因为各种srand...  发表于 2015-5-27 17:43
你这是均匀分布的么?  发表于 2015-5-27 13:38
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-27 14:02:45 来自手机 | 显示全部楼层
rand()的范围好像是0-32768
rand()*rand()%10000000重码太多了。

点评

你要不重复只能用洗牌算法来打乱  发表于 2015-5-27 17:45
rand()*rand()%10000000只是让范围落到里面  发表于 2015-5-27 17:44
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-27 20:51:18 | 显示全部楼层
了解了,感觉vc比较矫情,什么都有按规矩来写,不然很容易报错。
还是vb来得简单快捷!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-28 21:25:41 来自手机 | 显示全部楼层
我想vb的那个call msvcrt.qsort跟vc的速度是一样的,因为vb的那段代码,只是初始化的时候执行了一次,而且排序也只需执行一次msvcrt.qsort。
回复 支持 反对

使用道具 举报

发表于 2015-5-30 08:59:48 | 显示全部楼层
分段随机试试。把0~1000 0000分成一万段,这样就有 1000份了,然后从这一千份里面 随机一个数,然后在从 每一份里面随机一个数~

点评

这样的话,重码的几率会很大  发表于 2015-5-30 09:09
回复 支持 反对

使用道具 举报

发表于 2015-5-31 09:37:46 | 显示全部楼层
本帖最后由 苍茫 于 2015-5-31 09:54 编辑

#include<time.h>
long get_rand(long lower,long upper)
{
       time_t  t = time(NULL);
       long temp  = t*t*t % (upper-lower+1);   //好象t 的 n 次方 , n越大,随机性越强
       return (long)  (((double)temp/(upper-lower))*(upper-lower)+lower);   
}

点评

对你这个程序直接表示无语,你这个只要在一秒钟之内调用,无论调用多少次,结果都是一样的  发表于 2015-5-31 11:37
回复 支持 反对

使用道具 举报

发表于 2015-5-31 14:25:29 | 显示全部楼层
本帖最后由 苍茫 于 2015-5-31 14:30 编辑
苍茫 发表于 2015-5-31 09:37
#include
long get_rand(long lower,long upper)
{


不好意思 ,没考虑到,改下:

long get_rand(long lower,long upper)
{
       static unsigned long temp = 1;
       time_t  t = time(NULL);
       temp  = temp* t*t % (upper-lower+1);  
       return (long)  (((double)temp/(upper-lower))*(upper-lower)+lower);   

}

未命名.JPG
回复 支持 反对

使用道具 举报

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

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-2-3 14:27

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表