为c写标准的人不会注意不到这个,还有什么道理在里面吗?
17 个解决方案
#1
加上这个
#include <time.h>
srand(time(NULL));
#include <time.h>
srand(time(NULL));
#2
rand() 产生的是伪随机数 ,条件(种子)一样,结果是可以重复的。 这个和真实世界里抛硬币不一样,抛硬币即使条件完全一样,结果也是不能重复的
#3
因为那是伪随机数, 是通过算法得出来的。 算法已经定死了, 起始值一样, 结果当然就一样啦。
如果想引入真正的随机值, 就需要和硬件或者操作系统打交道, 那么就超出c++语言本身的范畴同时失去可移植性了, 所以c++的标准化组织不愿意采用。
如果想引入真正的随机值, 就需要和硬件或者操作系统打交道, 那么就超出c++语言本身的范畴同时失去可移植性了, 所以c++的标准化组织不愿意采用。
#4
C语言里不能调用真正随机数吗?
我看完基础教程好像没提到这个。
我看完基础教程好像没提到这个。
#5
所谓随机数只不过是一个数列,种子是指从哪一个位置开始的。
另外,真正随机数只存在有理论上的
另外,真正随机数只存在有理论上的
#6
带有真正意味的随机数,电脑中也是可以产生的,
比如说硬件软件的异常,中断时间啦什么的,不过随机数实在是个相当复杂的问题, 没有必要还是不要费精力琢磨了
比如说硬件软件的异常,中断时间啦什么的,不过随机数实在是个相当复杂的问题, 没有必要还是不要费精力琢磨了
#7
看来我要认真研究一下
#8
任何软件产生的随机数都不是真随机数,因为软件只能按照某种规律生产数字,
#9
rand()是其实是伪随机。具体的实现思路是这样:定义了一个很大的随机串,例如:
[1][2][3][4][5][6][7][8][9][0][9][8][7][6][5][4][3][2][1]...
而种子的含义其实是指定rand()从这个随机串的哪个位置开始读,比如用2作为种子,你调用rand()得到的就是2, 再调用就是3, 依此类推。
当然,真正的随机串比上面的例子复杂多了,但是实现思路是一样的。
如果不用srand()指定种子, 每次其实都是从随机串开始取随机数,所以得到一样的随机数。
一般的,都是使用srand(time(NULL));把时间作为种子。
[1][2][3][4][5][6][7][8][9][0][9][8][7][6][5][4][3][2][1]...
而种子的含义其实是指定rand()从这个随机串的哪个位置开始读,比如用2作为种子,你调用rand()得到的就是2, 再调用就是3, 依此类推。
当然,真正的随机串比上面的例子复杂多了,但是实现思路是一样的。
如果不用srand()指定种子, 每次其实都是从随机串开始取随机数,所以得到一样的随机数。
一般的,都是使用srand(time(NULL));把时间作为种子。
#10
种子一样,用rand()产生的随机数就会一样?
这是因为C采用的随机数算法生成的是一个随机数数列。采用的是固定的算化,初始值相同,结果当然相同。
这是因为C采用的随机数算法生成的是一个随机数数列。采用的是固定的算化,初始值相同,结果当然相同。
#11
今天到图书馆翻了一下,得出以下结论:
1)用程序只能得到伪随机数。很显然,任何程序的结果都是可预测的,既然可预测,就不是随机的。
2)产生随机数的大致思路是:先给定一个初值(种子),然后由这个初值出发用一定的算法得到一个或一列数,即随机数。
得到的随机数的随机性的好坏与所用的算法有直接的关系。
3)不是c标准委员会没有注意到,他们也是没有办法,呵呵。
以上是小弟的看法,望各位大哥指正。
1)用程序只能得到伪随机数。很显然,任何程序的结果都是可预测的,既然可预测,就不是随机的。
2)产生随机数的大致思路是:先给定一个初值(种子),然后由这个初值出发用一定的算法得到一个或一列数,即随机数。
得到的随机数的随机性的好坏与所用的算法有直接的关系。
3)不是c标准委员会没有注意到,他们也是没有办法,呵呵。
以上是小弟的看法,望各位大哥指正。
#12
电脑当然可以产生真正意味的随机数, 只是那是相当麻烦且没有移植性的。
比如说, 可以利用寻页异常出现的频率啦, 接受到的网卡中断的次数啦, 内存总线仲裁的次数啦, cpu遇到偶然性异常的时间啦, 硬件设备出现完全随机性的事件啦, 都可以成为生成随机数的参考。
当然上面提到的很多是不能用来作随机数的, 因为有被黑客利用的可能。
比如说, 可以利用寻页异常出现的频率啦, 接受到的网卡中断的次数啦, 内存总线仲裁的次数啦, cpu遇到偶然性异常的时间啦, 硬件设备出现完全随机性的事件啦, 都可以成为生成随机数的参考。
当然上面提到的很多是不能用来作随机数的, 因为有被黑客利用的可能。
#13
12楼所说的随机源,都是寻找种子的方法,不是么?这和srand没有本质的区别。
#14
本质上的区别? 什么是本质上的区别?
如果世界上的万物真的是符合逻辑的, 那么背后一定有规律, 所以宇宙中没有真正的随机数存在的, 只有一些人类尚未了解的隐参数而已, 除非上帝是靠掷色子来创造世界的。
当然这只是爱因斯坦的理论,薛定谔对此有不同的看法。
随机数真的是相当复杂的话题, 越扯越远了。
如果世界上的万物真的是符合逻辑的, 那么背后一定有规律, 所以宇宙中没有真正的随机数存在的, 只有一些人类尚未了解的隐参数而已, 除非上帝是靠掷色子来创造世界的。
当然这只是爱因斯坦的理论,薛定谔对此有不同的看法。
随机数真的是相当复杂的话题, 越扯越远了。
#15
学习了,原来随机数是这么得到的呀。
#16
RandomNumber.h
RandomNumber.cpp
#ifndef RANDOM_NUMBER
#define RANDOM_NUMBER
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber
{
private:
unsigned long randSeed;
public:
RandomNumber(unsigned long s = 0);
unsigned short Random(unsigned long n);
double fRandom(void);
};
#endif
RandomNumber.cpp
#include "RandomNumber.h"
#include <time.h>
RandomNumber::RandomNumber(unsigned long s)
{
time_t t;
t = time(NULL);
tm *p = localtime(&t);
if(s == 0)
randSeed = (p->tm_hour * 60 + p->tm_min) * 60 + p->tm_sec;
else
randSeed = s;
}
unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}
double RandomNumber::fRandom()
{
return Random(maxshort)/double(maxshort);
}
#17
谢谢大家捧场,这个问题本来就是仁者见仁,智者见智,在于个人的理解。
最最重要的是大家凡事都应深思才是。
最最重要的是大家凡事都应深思才是。
#1
加上这个
#include <time.h>
srand(time(NULL));
#include <time.h>
srand(time(NULL));
#2
rand() 产生的是伪随机数 ,条件(种子)一样,结果是可以重复的。 这个和真实世界里抛硬币不一样,抛硬币即使条件完全一样,结果也是不能重复的
#3
因为那是伪随机数, 是通过算法得出来的。 算法已经定死了, 起始值一样, 结果当然就一样啦。
如果想引入真正的随机值, 就需要和硬件或者操作系统打交道, 那么就超出c++语言本身的范畴同时失去可移植性了, 所以c++的标准化组织不愿意采用。
如果想引入真正的随机值, 就需要和硬件或者操作系统打交道, 那么就超出c++语言本身的范畴同时失去可移植性了, 所以c++的标准化组织不愿意采用。
#4
C语言里不能调用真正随机数吗?
我看完基础教程好像没提到这个。
我看完基础教程好像没提到这个。
#5
所谓随机数只不过是一个数列,种子是指从哪一个位置开始的。
另外,真正随机数只存在有理论上的
另外,真正随机数只存在有理论上的
#6
带有真正意味的随机数,电脑中也是可以产生的,
比如说硬件软件的异常,中断时间啦什么的,不过随机数实在是个相当复杂的问题, 没有必要还是不要费精力琢磨了
比如说硬件软件的异常,中断时间啦什么的,不过随机数实在是个相当复杂的问题, 没有必要还是不要费精力琢磨了
#7
看来我要认真研究一下
#8
任何软件产生的随机数都不是真随机数,因为软件只能按照某种规律生产数字,
#9
rand()是其实是伪随机。具体的实现思路是这样:定义了一个很大的随机串,例如:
[1][2][3][4][5][6][7][8][9][0][9][8][7][6][5][4][3][2][1]...
而种子的含义其实是指定rand()从这个随机串的哪个位置开始读,比如用2作为种子,你调用rand()得到的就是2, 再调用就是3, 依此类推。
当然,真正的随机串比上面的例子复杂多了,但是实现思路是一样的。
如果不用srand()指定种子, 每次其实都是从随机串开始取随机数,所以得到一样的随机数。
一般的,都是使用srand(time(NULL));把时间作为种子。
[1][2][3][4][5][6][7][8][9][0][9][8][7][6][5][4][3][2][1]...
而种子的含义其实是指定rand()从这个随机串的哪个位置开始读,比如用2作为种子,你调用rand()得到的就是2, 再调用就是3, 依此类推。
当然,真正的随机串比上面的例子复杂多了,但是实现思路是一样的。
如果不用srand()指定种子, 每次其实都是从随机串开始取随机数,所以得到一样的随机数。
一般的,都是使用srand(time(NULL));把时间作为种子。
#10
种子一样,用rand()产生的随机数就会一样?
这是因为C采用的随机数算法生成的是一个随机数数列。采用的是固定的算化,初始值相同,结果当然相同。
这是因为C采用的随机数算法生成的是一个随机数数列。采用的是固定的算化,初始值相同,结果当然相同。
#11
今天到图书馆翻了一下,得出以下结论:
1)用程序只能得到伪随机数。很显然,任何程序的结果都是可预测的,既然可预测,就不是随机的。
2)产生随机数的大致思路是:先给定一个初值(种子),然后由这个初值出发用一定的算法得到一个或一列数,即随机数。
得到的随机数的随机性的好坏与所用的算法有直接的关系。
3)不是c标准委员会没有注意到,他们也是没有办法,呵呵。
以上是小弟的看法,望各位大哥指正。
1)用程序只能得到伪随机数。很显然,任何程序的结果都是可预测的,既然可预测,就不是随机的。
2)产生随机数的大致思路是:先给定一个初值(种子),然后由这个初值出发用一定的算法得到一个或一列数,即随机数。
得到的随机数的随机性的好坏与所用的算法有直接的关系。
3)不是c标准委员会没有注意到,他们也是没有办法,呵呵。
以上是小弟的看法,望各位大哥指正。
#12
电脑当然可以产生真正意味的随机数, 只是那是相当麻烦且没有移植性的。
比如说, 可以利用寻页异常出现的频率啦, 接受到的网卡中断的次数啦, 内存总线仲裁的次数啦, cpu遇到偶然性异常的时间啦, 硬件设备出现完全随机性的事件啦, 都可以成为生成随机数的参考。
当然上面提到的很多是不能用来作随机数的, 因为有被黑客利用的可能。
比如说, 可以利用寻页异常出现的频率啦, 接受到的网卡中断的次数啦, 内存总线仲裁的次数啦, cpu遇到偶然性异常的时间啦, 硬件设备出现完全随机性的事件啦, 都可以成为生成随机数的参考。
当然上面提到的很多是不能用来作随机数的, 因为有被黑客利用的可能。
#13
12楼所说的随机源,都是寻找种子的方法,不是么?这和srand没有本质的区别。
#14
本质上的区别? 什么是本质上的区别?
如果世界上的万物真的是符合逻辑的, 那么背后一定有规律, 所以宇宙中没有真正的随机数存在的, 只有一些人类尚未了解的隐参数而已, 除非上帝是靠掷色子来创造世界的。
当然这只是爱因斯坦的理论,薛定谔对此有不同的看法。
随机数真的是相当复杂的话题, 越扯越远了。
如果世界上的万物真的是符合逻辑的, 那么背后一定有规律, 所以宇宙中没有真正的随机数存在的, 只有一些人类尚未了解的隐参数而已, 除非上帝是靠掷色子来创造世界的。
当然这只是爱因斯坦的理论,薛定谔对此有不同的看法。
随机数真的是相当复杂的话题, 越扯越远了。
#15
学习了,原来随机数是这么得到的呀。
#16
RandomNumber.h
RandomNumber.cpp
#ifndef RANDOM_NUMBER
#define RANDOM_NUMBER
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber
{
private:
unsigned long randSeed;
public:
RandomNumber(unsigned long s = 0);
unsigned short Random(unsigned long n);
double fRandom(void);
};
#endif
RandomNumber.cpp
#include "RandomNumber.h"
#include <time.h>
RandomNumber::RandomNumber(unsigned long s)
{
time_t t;
t = time(NULL);
tm *p = localtime(&t);
if(s == 0)
randSeed = (p->tm_hour * 60 + p->tm_min) * 60 + p->tm_sec;
else
randSeed = s;
}
unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}
double RandomNumber::fRandom()
{
return Random(maxshort)/double(maxshort);
}
#17
谢谢大家捧场,这个问题本来就是仁者见仁,智者见智,在于个人的理解。
最最重要的是大家凡事都应深思才是。
最最重要的是大家凡事都应深思才是。