当前位置: 代码迷 >> C语言 >> [讨论]有关rand()生成数的大小..
  详细解决方案

[讨论]有关rand()生成数的大小..

热度:351   发布时间:2007-11-01 20:02:35.0
[讨论]有关rand()生成数的大小..
我想生成32bits的随机数...现在想知道rand()最大能生成多少bits的随机数
搜索更多相关的解决方案: rand  成数  

----------------解决方案--------------------------------------------------------
当然是32位可以表示的最大数.
----------------解决方案--------------------------------------------------------

可是经过反复测试,是生成的16位的随机数..
#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#include "conio.h"
void generate(unsigned int *R)
{
int i;;
time_t t;
srand((unsigned) time(&t));
printf("Ten random numbers:\n");
for(i=0; i<32; i++)
{
R[i]=rand()*rand();
printf("%x\n", R[i]);
}
}

int main(void)
{
unsigned int *R;R=new unsigned int[32];
generate(R);

getch();
return 0;
}
#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#include "conio.h"
void generate(unsigned int *R)
{
int i;;
time_t t;
srand((unsigned) time(&t));
printf("Ten random numbers:\n");
for(i=0; i<32; i++)
{
R[i]=rand()*rand();
printf("%x\n", R[i]);
}
}

int main(void)
{
unsigned int *R;R=new unsigned int[32];
generate(R);

getch();
return 0;
}
Ten random numbers:
89d9ea0
107eb108
12af1c0
1e3488ac
5e86a7f
72acb6f
1a5928a
317f883
47d81e4
3a6d988
11f9e460
20ba7cc
30f778da
1d0dcaf8
f54d434
6f70c74
d06eb7e
28d82fa9
1fd1db8d
19035106
d4623e0
2be5805
1beded80
95350a7
20727cbe
34090086
2e1ea8d8
8cc425
225505e7
20806e0
24b2dbb6
e6f8c10
这个结果是rand()*rand()得到的
下面是rand()得到:
Ten random numbers:
5eb4
2629
412e
5861
64b1
69fc
3b9c
41a7
2070
4c46
5f5f
54b7
5176
4ad0
3e30
7b36
1e66
6fb
73fd
2129
43bd
9a4
6b3c
3800
1abf
7e4a
3b7f
6ad3
cb2
2973
5648
67eb
谁能给我解释下


----------------解决方案--------------------------------------------------------
我的意思其实随机数的最大值肯定是你机器和编译器决定的位数.
和定义的一般变量的范围一样.(应该是和int相同吧).
----------------解决方案--------------------------------------------------------

楼主看看rand()的返回类型就知道了.

rand()返回值就是一个随机的,楼主怎么可能要rand()返回一个一定达到32bit的数.


----------------解决方案--------------------------------------------------------
我还是不明白啊...我的意思是生成的最大的数是32bits就可以...
我用rand()返回的那一组数,最大的是16位的啊。。我怎么考虑都最大的应该是32位的啊。。我在不同的机子上运行,都是最大16位的。。。谁能给我说说为甚么啊
----------------解决方案--------------------------------------------------------
[0,RAND_MAX]
----------------解决方案--------------------------------------------------------

如果想要 unsigned int 可以自己升级它们。
R[i] = (unsigned int)intrand() * (unsigned int)rand();

for(i=0; i<32; i++)
{
R[i] = (unsigned int)intrand() * (unsigned int)rand();
printf("%x\n", R[i]);
}

//-------------------------------------------------//

若这样还不行,那就>>>
unsigned int ra1;
unsigned int ra2;
..........

for(i=0; i<32; i++)
{
ra1 = rand();
ra2 = rand();
R[i] = ra1 * ra2;
printf("%x\n", R[i]);
}

这个所有编译器都能很好的处理。


----------------解决方案--------------------------------------------------------
以下是引用cosdos在2007-11-3 22:04:32的发言:

如果想要 unsigned int 可以自己升级它们。
R[i] = (unsigned int)intrand() * (unsigned int)rand();

for(i=0; i<32; i++)
{
R[i] = (unsigned int)intrand() * (unsigned int)rand();
printf("%x\n", R[i]);
}

//-------------------------------------------------//

若这样还不行,那就>>>
unsigned int ra1;
unsigned int ra2;
..........

for(i=0; i<32; i++)
{
ra1 = rand();
ra2 = rand();
R[i] = ra1 * ra2;
printf("%x\n", R[i]);
}

这个所有编译器都能很好的处理。

楼主需要的是32位的随机数,而不是32个随机数,不知道楼上何出此CODE。
另外,随机变量X,Y均在[0,RAND_MAX]上服从均匀分布,X*Y的分布情况如何呢?是在[0,RAND_MAX*RAND_MAX]服从均匀分布吗?
如果是的话如何证明呢?
如果不是的话,这种做法是否欠妥呢
----------------解决方案--------------------------------------------------------
又想了想我上面的问法有些错误,X,Y都是离散型随机变量,不是服从均匀分布。
而X*Y的分布没有必要讨论了。
如果按照cosdos的做法,(RAND_MAX,RAND_MAX*RAND_MAX]之间的质数被随机到的可能性是0,原因很简单一个质数不可能被分解成两个数的乘积的形式,所以这种做法确实是欠妥的。
----------------解决方案--------------------------------------------------------