关于rand函数的问题
怎么利用rand函数随机0~100000000的数?随机的数不要重复。(不要每次运行出来的都是同一个,或者两次随机的数相差无几)
随机数每次都会有几个位发生变化。(我自己写的那个,每次都是1开头,无语了)
已经百度了
对于 srand( (unsigned)time( NULL ) ); 这语句
感觉没什么用
#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:09 编辑
rand()会返回一随机数值,范围在0至RAND_MAX 间。(RAND_MAX和rand()都在stdlib.h里面声明的,RAND_MAX是可最大随机的值)
srand()这句是设计随机数种子,如果没有设置的话,那在调用rand()的时候会自动设置随机种子为1,那么以后不管你再rand多少次,因为种子只有一个且相同,所以值都是一样的;如果设置的srand()的种子数量是固定的,那么也会导致随机数相同,所以srand( (unsigned)time( NULL ) );非常必要。
在每次rand的时候使用srand试试
对于每次随机数产生多少你需要去看一看rand的随机原理。
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:22
我试过了,但是随即出来的数,基本没变啊。
比如:
第一次 1234567
代码贴出来看看 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();
}
还没有改完就卡主了。。。 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:} 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;这样如果再把它减掉就可以将随机数圈定在你需要的范围内。
其实这一步简言之就是实现在你需要的范围内生成随机数,不要超出了。 Xiao_肚oO 发表于 2015-1-19 00:01
,首先我不是什么大神,只要坚持学下去你有可能会更牛的。
rand()函数的范围就是0~RAND_ ...
略懂略懂了。。。谢谢
页:
[1]