srand
和rand 怎么用(是不是配合用啊),种子上怎么回事啊,同样的种子下去随机数都一样了。。
我种子数怎么填啊, 谢谢:
11 个解决方案
#1
#include<stdio.h>
int main(void)
{
unsigned j,k;
srand(j);
k=rand();
printf("%d %u",sizeof(k),k);
getch();
return 0;
}
int main(void)
{
unsigned j,k;
srand(j);
k=rand();
printf("%d %u",sizeof(k),k);
getch();
return 0;
}
#2
srand( (unsigned)time( NULL ) );
unsigned int result = rand();
得到result 后再判断大小了,太小就乘上一个数.
unsigned int result = rand();
得到result 后再判断大小了,太小就乘上一个数.
#3
srand(time(NULL));
#4
太小就乘上一个数.???
这样都行?!
这样都行?!
#5
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream.h>
#include<string.h>
int main()
{
srand(time(0));
int k;
char str[32] ;
char kk;
for(int i=0;i<32;i++)
{
k=rand()%10;
str[i]=k+48;
cout<<str[i];
}
system("pause");
return 0;
}
#include<stdlib.h>
#include<time.h>
#include<iostream.h>
#include<string.h>
int main()
{
srand(time(0));
int k;
char str[32] ;
char kk;
for(int i=0;i<32;i++)
{
k=rand()%10;
str[i]=k+48;
cout<<str[i];
}
system("pause");
return 0;
}
#6
多谢各位;
用时间我考虑过了,由于我在设备启动过程中用到,设备中没有象pc 断电还计时间的bios
所以如果用time 每次启动取到的都是一个数值(或很接近,几次就会重复)
用时间我考虑过了,由于我在设备启动过程中用到,设备中没有象pc 断电还计时间的bios
所以如果用time 每次启动取到的都是一个数值(或很接近,几次就会重复)
#7
在设备启动过程中用到?那就不懂了
#8
一般都只有用时间来初始化呀。
其他东西都不好保证每次种的种子不一样..
其他东西都不好保证每次种的种子不一样..
#9
读入某些端口的数据来初始化呢?看你程序启动的时候,那些端口是未定义的,然后就使用那些端口的数据,同时结合时间。使用+,^等等,都可以。
或者使用文件,记录上次的种子,然后这次将种子加1,保存(或者加更多),产生的随机序列有发散效应,变化也很大。(或者用程序退出前最后一个随即数进行处理也可以)。
需要32位的话,任意取2个数据之后相成,则可以了,(因为rand是返回16位的数据,所以相乘大致可以模拟32位,不过建议还是采用2次取rand,然后使用<<来做: u_int data = rand()<<16+rand();这样子比相乘要随机,不会出现乘法的聚集效应,而且速度更快。
或者使用文件,记录上次的种子,然后这次将种子加1,保存(或者加更多),产生的随机序列有发散效应,变化也很大。(或者用程序退出前最后一个随即数进行处理也可以)。
需要32位的话,任意取2个数据之后相成,则可以了,(因为rand是返回16位的数据,所以相乘大致可以模拟32位,不过建议还是采用2次取rand,然后使用<<来做: u_int data = rand()<<16+rand();这样子比相乘要随机,不会出现乘法的聚集效应,而且速度更快。
#10
太小就乘上一个数.???
这样都行?!
===================》
没问题的,本来生成的就是一个随机数。你对它进行操作后,它还是一个随机的。
这样都行?!
===================》
没问题的,本来生成的就是一个随机数。你对它进行操作后,它还是一个随机的。
#11
可以用汇编指令rdtsc(只对x86 cpu有效)来产生一个随机数种子
#1
#include<stdio.h>
int main(void)
{
unsigned j,k;
srand(j);
k=rand();
printf("%d %u",sizeof(k),k);
getch();
return 0;
}
int main(void)
{
unsigned j,k;
srand(j);
k=rand();
printf("%d %u",sizeof(k),k);
getch();
return 0;
}
#2
srand( (unsigned)time( NULL ) );
unsigned int result = rand();
得到result 后再判断大小了,太小就乘上一个数.
unsigned int result = rand();
得到result 后再判断大小了,太小就乘上一个数.
#3
srand(time(NULL));
#4
太小就乘上一个数.???
这样都行?!
这样都行?!
#5
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream.h>
#include<string.h>
int main()
{
srand(time(0));
int k;
char str[32] ;
char kk;
for(int i=0;i<32;i++)
{
k=rand()%10;
str[i]=k+48;
cout<<str[i];
}
system("pause");
return 0;
}
#include<stdlib.h>
#include<time.h>
#include<iostream.h>
#include<string.h>
int main()
{
srand(time(0));
int k;
char str[32] ;
char kk;
for(int i=0;i<32;i++)
{
k=rand()%10;
str[i]=k+48;
cout<<str[i];
}
system("pause");
return 0;
}
#6
多谢各位;
用时间我考虑过了,由于我在设备启动过程中用到,设备中没有象pc 断电还计时间的bios
所以如果用time 每次启动取到的都是一个数值(或很接近,几次就会重复)
用时间我考虑过了,由于我在设备启动过程中用到,设备中没有象pc 断电还计时间的bios
所以如果用time 每次启动取到的都是一个数值(或很接近,几次就会重复)
#7
在设备启动过程中用到?那就不懂了
#8
一般都只有用时间来初始化呀。
其他东西都不好保证每次种的种子不一样..
其他东西都不好保证每次种的种子不一样..
#9
读入某些端口的数据来初始化呢?看你程序启动的时候,那些端口是未定义的,然后就使用那些端口的数据,同时结合时间。使用+,^等等,都可以。
或者使用文件,记录上次的种子,然后这次将种子加1,保存(或者加更多),产生的随机序列有发散效应,变化也很大。(或者用程序退出前最后一个随即数进行处理也可以)。
需要32位的话,任意取2个数据之后相成,则可以了,(因为rand是返回16位的数据,所以相乘大致可以模拟32位,不过建议还是采用2次取rand,然后使用<<来做: u_int data = rand()<<16+rand();这样子比相乘要随机,不会出现乘法的聚集效应,而且速度更快。
或者使用文件,记录上次的种子,然后这次将种子加1,保存(或者加更多),产生的随机序列有发散效应,变化也很大。(或者用程序退出前最后一个随即数进行处理也可以)。
需要32位的话,任意取2个数据之后相成,则可以了,(因为rand是返回16位的数据,所以相乘大致可以模拟32位,不过建议还是采用2次取rand,然后使用<<来做: u_int data = rand()<<16+rand();这样子比相乘要随机,不会出现乘法的聚集效应,而且速度更快。
#10
太小就乘上一个数.???
这样都行?!
===================》
没问题的,本来生成的就是一个随机数。你对它进行操作后,它还是一个随机的。
这样都行?!
===================》
没问题的,本来生成的就是一个随机数。你对它进行操作后,它还是一个随机的。
#11
可以用汇编指令rdtsc(只对x86 cpu有效)来产生一个随机数种子