tjf 发表于 2015-1-17 13:55:27

关于rand函数的问题

怎么利用rand函数随机0~100000000的数?
随机的数不要重复。(不要每次运行出来的都是同一个,或者两次随机的数相差无几)
随机数每次都会有几个位发生变化。(我自己写的那个,每次都是1开头,无语了)
已经百度了
对于 srand( (unsigned)time( NULL ) ); 这语句
感觉没什么用

Xiao_肚oO 发表于 2015-1-17 13:55:28

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main()
{

        double x, y;

        char *ch[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
        char *ch1[] = { "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };
        char num;
        long i, n, j, m, y1;
       
        /* Maximum value that can be returned by the rand function. */
        /* #define RAND_MAX 0x7fff */
        /*上面的定义是从文档中取得,
                他定义了RAND_MAX = 0x7fff(也就是10进制的32767)*/
        /*这句话的意思是rand()得到的随机数与1000000000进行求余,
                即x的最大值为 32767 % 1000000000,还是等于原数呀!
                所以可以这样理解:
                (x = rand() % 1000000000;) == (x = rand();)*/
        /*如果你要随机0~100000000的数则可以这样写:*/
        double number = {0};/*number和number作为乘数,number作为常系数*/
        srand((unsigned)time(NULL));
        number = rand();
        printf("Number: %lf\n", number);
        number = rand();
        printf("Number: %lf\n", number);
        number = (RAND_MAX*RAND_MAX) % 100000000;
        if (number * number > number)
                x = number * number - number;
        else x = number * number;
        printf("Input: %lf\n", x);

                /*这是我自己改的*/
        /*
        srand((unsigned)time(NULL));
        x = rand() % 1000000000;
        */
        /*.....................*/

        n = (long)x;
        y = x - n;/*得小数部分*/
        for (i = 0; n != 0; i++)
        {
                /*ERROR num是字符串不能这样复制需要num的形式*/
                /*num = (char)(n % 10);*/
                num = (char)(n % 10);

                n /= 10;
        }
        m = i;
        /*num = '.';*/
        num = '.';

        for (y = y * 10; (y - (long)y) * 10 > 0;)
                y *= 10;/*小数转化为整数如0.11111转为11111.00...*/
        y1 = (long)y;
        for (i = m + 1; y1 != 0; i++)
        {
                /*num = (char)(y1 % 10);*/
                num = (char)(y1 % 10);

                y1 = y1 / 10;
        }/*取各位上的数字*/

        printf("Output: ");
        for (n = 0;; n++)
        {
                if (num == '.')
                {
                        for (j = n - 1; j >= 0; j--)/*判断是否是万位,亿位..如是再判断是否是0如是就不输出零.*/
                        {
                                if (m <= 5)
                                if (m == 5 && (int)num == 0)
                                        ;
                                else
                                        printf("%s", ch[(int)num]);/*输出大写壹..*/
                                else
                                if (m % 4 == 0 && (int)num == 0)
                                        ;
                                else
                                        printf("%s", ch[(int)num]);
                                if (m >= 2)
                                {
                                        printf("%s", ch1);/*输出拾佰仟..如有2位就输出拾*/
                                        m = m--;
                                }
                        }
                        printf("点");
                        break;
                }
        }
        for (i = i - 1; num != '.'; i--)
                /*printf("%s", ch[(int)num]);*//*输出小数部分*/
                printf("%s", ch[(int)num]);

        printf("零\n");
        getchar();
}

以下是三次运行结果,number和number是生成的两个随机数:
http://bbs.fishc.com/data/attachment/album/201501/18/040712fr0risfesikhh50x.png
http://bbs.fishc.com/data/attachment/album/201501/18/040705vu9pk1y8311epeeh.png
http://bbs.fishc.com/data/attachment/album/201501/18/040654la4umj4uuxucimi1.png

Xiao_肚oO 发表于 2015-1-17 14:08:07

本帖最后由 Xiao_肚oO 于 2015-1-17 14:09 编辑

rand()会返回一随机数值,范围在0至RAND_MAX 间。(RAND_MAX和rand()都在stdlib.h里面声明的,RAND_MAX是可最大随机的值)
srand()这句是设计随机数种子,如果没有设置的话,那在调用rand()的时候会自动设置随机种子为1,那么以后不管你再rand多少次,因为种子只有一个且相同,所以值都是一样的;如果设置的srand()的种子数量是固定的,那么也会导致随机数相同,所以srand( (unsigned)time( NULL ) );非常必要。
在每次rand的时候使用srand试试
对于每次随机数产生多少你需要去看一看rand的随机原理。

tjf 发表于 2015-1-17 14:22:39

Xiao_肚oO 发表于 2015-1-17 14:08
rand()会返回一随机数值,范围在0至RAND_MAX 间。(RAND_MAX和rand()都在stdlib.h里面声明的,RAND_MAX是可 ...

我试过了,但是随即出来的数,基本没变啊。
比如:
第一次    1234567
第二次    1234575

而且前面的一两位数几乎不会变

tjf 发表于 2015-1-17 14:23:43

可不可以每次变化大一点啊

我次次运行后的数字都差不多

Xiao_肚oO 发表于 2015-1-17 14:54:08

tjf 发表于 2015-1-17 14:22
我试过了,但是随即出来的数,基本没变啊。
比如:
第一次    1234567


代码贴出来看看

tjf 发表于 2015-1-17 21:41:21

Xiao_肚oO 发表于 2015-1-17 14:54
代码贴出来看看

我是想做个程序。(本来是想网上找个可以练习数字金额大小写转换的软件,可惜没有)
内容是随机出现一个大写金额。然后由用户输入对应的小写金额。最后判断是否正确。
我已经在网上找到一部分代码了。我在这个代码基础上改动了一下。


#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main()
{

double x,y;

char *ch[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
char *ch1[]={"拾","佰","仟","万","拾","佰","仟","亿"};
char num;
long i,n,j,m,y1;

                                                   /*这是我自己改的*/
srand( (unsigned)time( NULL ) );
x=rand()%1000000000;
                                                    /*.....................*/

n=(long)x;
y=x-n;/*得小数部分*/
for(i=0;n!=0;i++)
{
num=(char)(n%10);
n/=10;
}
m=i;
num='.';
for(y=y*10;(long)((y- (long)y)*10);)
    y*=10;/*小数转化为整数如0.11111转为11111.00...*/
y1=(long)y;
for(i=m+1;y1!=0;i++)
    {num=(char)(y1%10);
      y1=y1/10;}/*取各位上的数字*/
for(n=0;;n++)
{
    if(num=='.')
      {
      for(j=n-1;j>=0;j--)/*判断是否是万位,亿位..如是再判断是否是0如是就不输出零.*/
          {
          if(m<=5)
            if(m==5&&(int)num==0)
            ;
            else
                printf("%s",ch[(int)num]);/*输出大写壹..*/
          else
            if(m%4==0&&(int)num==0)
                  ;
            else
            printf("%s",ch[(int)num]);
          if(m>=2)
            {printf("%s",ch1);/*输出拾佰仟..如有2位就输出拾*/
            m=m--;}
          }
      printf("点");
      break;
      }
}
for(i=i-1;num!='.';i--)
    printf("%s",ch[(int)num]);/*输出小数部分*/

printf("\n");
getchar();
}


还没有改完就卡主了。。。

tjf 发表于 2015-1-18 12:32:57

Xiao_肚oO 发表于 2015-1-18 04:11
以下是三次运行结果,number和number是生成的两个随机数:

大神,给跪了!
谢谢了。

不过下面这句起什么作用
number = (RAND_MAX*RAND_MAX) % 100000000;00;

就是   RAND_MAX*RAND_MAX   有什么作用?



还有你写的rand范围是什么?

{:5_94:}
那方面基础基本没有,麻烦你了。
{:5_109:}

Xiao_肚oO 发表于 2015-1-19 00:01:07

tjf 发表于 2015-1-18 12:32
大神,给跪了!
谢谢了。



:lol::lol::lol:,首先我不是什么大神,只要坚持学下去你有可能会更牛的。
rand()函数的范围就是0~RAND_MAX,RAND_MAX = 32767,即范围为0~32767;
关于number那句话是这样子的:
你需要的范围是0~100000000,而number*number的最大值是 32767*32767 = 1073676289,即为RAND_MAX*RAND_MAX,但是这个数大于了你要的范围;如果用100000000取余的话,那么number = 73676289;这样如果再把它减掉就可以将随机数圈定在你需要的范围内。
其实这一步简言之就是实现在你需要的范围内生成随机数,不要超出了。

tjf 发表于 2015-1-27 20:41:30

Xiao_肚oO 发表于 2015-1-19 00:01
,首先我不是什么大神,只要坚持学下去你有可能会更牛的。
rand()函数的范围就是0~RAND_ ...
略懂略懂了。。。谢谢
页: [1]
查看完整版本: 关于rand函数的问题