鱼C论坛

 找回密码
 立即注册
查看: 2142|回复: 9

关于rand函数的问题

[复制链接]
发表于 2015-1-17 13:55:27 | 显示全部楼层 |阅读模式
6鱼币
怎么利用rand函数随机0~100000000的数?
随机的数不要重复。(不要每次运行出来的都是同一个,或者两次随机的数相差无几)
随机数每次都会有几个位发生变化。(我自己写的那个,每次都是1开头,无语了)
已经百度了
对于 srand( (unsigned)time( NULL ) ); 这语句
感觉没什么用

最佳答案

查看完整内容

以下是三次运行结果,number[0]和number[1]是生成的两个随机数:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[256];
        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[3] = {0};/*number[0]和number[1]作为乘数,number[3]作为常系数*/
        srand((unsigned)time(NULL));
        number[0] = rand();
        printf("Number[0]: %lf\n", number[0]);
        number[1] = rand();
        printf("Number[1]: %lf\n", number[1]);
        number[2] = (RAND_MAX*RAND_MAX) % 100000000;
        if (number[0] * number[1] > number[2])
                x = number[0] * number[1] - number[2];
        else x = number[0] * number[1];
        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[i]的形式*/
                /*num = (char)(n % 10);*/
                num[i] = (char)(n % 10);

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

        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[i] = (char)(y1 % 10);

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

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

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

以下是三次运行结果,number[0]和number[1]是生成的两个随机数:

                               
登录/注册后可看大图


                               
登录/注册后可看大图


                               
登录/注册后可看大图

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
tjf + 1 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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的随机原理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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

而且前面的一两位数几乎不会变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-17 14:23:43 | 显示全部楼层
可不可以每次变化大一点啊

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

代码贴出来看看

评分

参与人数 1鱼币 +30 收起 理由
wei_Y + 30

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-17 21:41:21 | 显示全部楼层

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


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

double x,y;

char *ch[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
char *ch1[]={"拾","佰","仟","万","拾","佰","仟","亿"};
char num[256];
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[i]=(char)(n%10);
  n/=10;
  }
m=i;
num[i]='.';
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[i]=(char)(y1%10);
      y1=y1/10;}/*取各位上的数字*/
for(n=0;;n++)
  {
    if(num[n]=='.')
      {
      for(j=n-1;j>=0;j--)/*判断是否是万位,亿位..如是再判断是否是0如是就不输出零.*/
          {
          if(m<=5)
            if(m==5&&(int)num[j]==0)
              ;
            else
                printf("%s",ch[(int)num[j]]);/*输出大写壹..*/
          else
            if(m%4==0&&(int)num[j]==0)
                  ;
            else
              printf("%s",ch[(int)num[j]]);
          if(m>=2)
            {printf("%s",ch1[m-2]);/*输出拾佰仟..如有2位就输出拾*/
              m=m--;}
          }
      printf("点");
      break;
      }
  }
  for(i=i-1;num[i]!='.';i--)
    printf("%s",ch[(int)num[i]]);/*输出小数部分*/

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


还没有改完就卡主了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-18 12:32:57 | 显示全部楼层
Xiao_肚oO 发表于 2015-1-18 04:11
以下是三次运行结果,number[0]和number[1]是生成的两个随机数:

大神,给跪了!
谢谢了。

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

就是   RAND_MAX*RAND_MAX   有什么作用?



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


那方面基础基本没有,麻烦你了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[2]那句话是这样子的:
你需要的范围是0~100000000,而number[0]*number[1]的最大值是 32767*32767 = 1073676289,即为RAND_MAX*RAND_MAX,但是这个数大于了你要的范围;如果用100000000取余的话,那么number[2] = 73676289;这样如果再把它减掉就可以将随机数圈定在你需要的范围内。
其实这一步简言之就是实现在你需要的范围内生成随机数,不要超出了。

评分

参与人数 2荣誉 +1 鱼币 +31 收起 理由
wei_Y + 30
tjf + 1 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-27 20:41:30 | 显示全部楼层
Xiao_肚oO 发表于 2015-1-19 00:01
,首先我不是什么大神,只要坚持学下去你有可能会更牛的。
rand()函数的范围就是0~RAND_ ...

略懂略懂了。。。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 16:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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