概率编程原理
❶ 电脑中的随机数是怎么生成的(硬件方面的原理)
http://ke..com/view/1127.htm
伪随机数的生成方法
一般地,伪随机数的生成方法主要有以下3种[6]:
(1) 直接法(Direct Method),根据分布函数的物理意义生成。缺点是仅适用于某些具有特殊分布的随机数,如二项式分布、泊松分布。
(2) 逆转法(Inversion Method),假设U服从[0,1]区间上的均匀分布,令X=F-1(U),则X的累计分布函数(CDF)为F。该方法原理简单、编程方便、适用性广。
(3)接受拒绝法(Acceptance-Rejection Method):假设希望生成的随机数的概率密度函数(PDF)为f,则首先找到一个PDF为g的随机数发生器与常数c,使得f
[伪随机数发生器]
伪随机数发生器
(x)≤cg(x),然后根据接收拒绝算法求解。由于算法平均运算c次才能得到一个希望生成的随机数,因此c的取值必须尽可能小。显然,该算法的缺点是较难确定g与c。 因此,伪随机数生成器(PRNG)一般采用逆转法,其基础是均匀分布,均匀分布PRNG的优劣决定了整个随机数体系的优劣[7]。下文研究均匀分布的 PRNG。
随机数的“庐山真面目”
首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。
伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。(严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机。而未来的量子计算机有可能产生基于自然规律的不可重现的“真”随机数)。
❷ 学习编程序、学习c语言,需要用到非常深奥的数学原理吗
不需要,只需要基本的高数能力即可,当然对概率论,线性代数等等也是要懂一点的。总之一句话不需要学精。
❸ 当程序员需要什么知识
如果做一个专业的程序员:
1.基础语言知识 :从底层的ASM 到结构化的C,到面向对象的C++ java,如果不能都精通,但是要了解,至少要精通一门
2.基础数学知识: 高等数学(数学分析) 线性代数 离散数学,概率.数理统计等等
3.基础计算机原理:操作系统原理,微机原理,编译原理 数据库原来等等
4.看你感兴趣的学习一个方向:图形学...windows应用程序开发...Linux程序开发,数据库方面 网络编程,等等
----------------------------------------------------------------------
如果只是想快速编软件:
敬告:这样不会成为一个真正的高手!
比如windows平台的编程:<这里仅仅是比如>
学习C语言(熟悉结构化编程)->《windows程序设计》(学习windowsAPI知识) ->可以用API进行编程了。
但是现在用纯API编程几乎绝迹。不是淘汰,因为商业用要尽快成为软件好卖,API开发会消耗程序员大量时间,但是API是基础。
或者
学习C++语言(熟悉面向对象技术)->《MFC程序设计》(学习MFC编程)->MFC开发 -> MFC应用比较广
.net技术我没有接触过。现在正流行这个,等楼下的给你介绍吧!
------------------------------------
相比较而言,用DELPHI最省事。但是你要了解Object Pascal语言,这个编程工具是以这个语言为基础的。Delphi开发也是很不错的。
-------------------------------------
以上只是一个建议,学习不可能简单,而且路子不一样,上边提到的两windows书,是微软出版社,在这个方面最权威的书。
❹ 求一个概率算法
刚学过。这就是一个简单的离散分布的随机模拟嘛,直接说结果吧,原理就不说了。
首先你要得到一个(0,1)区间上的均匀分布的随机数,(可以查表,不过一般的软件都可以直接调的),记为 u(1),
然后记F(0)=0,F(A)=0.6 ,F(B)=0.8 ,F(C)=0.9, F(D)=0.95 ,F(E)=0.98,F(F)=1,这样(0,1)区间就被分成了6断,现在就看u(1)落在哪个区间里了,比如得到u(1)=0.7352,那就取 B 了,得到u(1)=0.9632那就取 E 了。
然后再取u(2),u(3)去对应,反正你要的多少随机数,就取几个u。
补充一下,由于不能重复,那么当你用u(1)得到B的话,就应该把F(B)这个点删除,然后在仿照上面的方法,注意这时区间长度不是1 了,所以你要对u(2)进行处理(用u(2)除以现在的区间长度)。
❺ 编程入门教程
1. 我应该选择什么编程语言
可能困扰编程新手最多的一个问题是【我应该学什么编程语言】或者【我需要学习哪些课程才能做出一个web、一个app】,很多人一直纠结这个问题,陷入了东学一点、西看一点的死循环,到头来啥也没学好,这会很浪费时间。
刚上大一的时候,我也很想知道应该选择什么编程语言。我问了很多人,网上各种查资料,但所能得到的答案都很片面,多数对这个问题答非所问,总是回答说“某某编程语言难”,“某某编程语言性能好”。其实作为初学者,我们对计算机体系都不了解,就不要过多地去纠结性能,或者难易等因素,原因我等下再说。
如果你有明确的方向,那么很好选择。如果你想做算法、机器学习方向,那么python是最好的选择。如果你想做web开发,java、php等都可以。如果想做一些更底层的工作,那么就可以选c。当然这是建立在你有明确方向的基础上。可是,很多人都没怎么接触过计算机行业,特别是和我一样刚入学就被调剂到计算机专业的人。对这些同学来说,各个编程语言就只是个名字,除了叫法不一样,你根本不知道它们有什么差别。所以索性不要纠结了,我替你选一个吧。
如果你是在校大学生,那么你有大把连续的时间,就先学习c,然后再学c++。我个人是学c入门的,也许很多人不理解我为什么推荐学c,因为c和c++都很难、很复杂,看起来并不适合入门。然而正是它们的难和复杂才能让你更好地理解计算机系统【计算机系统不是指操作系统】。学习编程不是学习编程语言,而是学习一个计算机生态,即一个庞大的知识体系。只会编程语言而不理解整个计算机的体系,就像只会写字而写不出好文章。了解c/c++和了解计算机系统是极为贴合的,向下可以帮助你更容易地理解操作系统、编译原理、计算机网络、计算机组成原理,为什么呢?因为较为底层的东西很多都是用c实现的,和系统的贴合度极高,很多教材源码甚至教程,在讲述这些知识的时候都是用c或c++作为媒介。而向上,c++面向对象的机制,也可以做出一些应用,譬如五子棋游戏等,也不会显得那么枯燥。花个小半年时间了解c和c++,之后你就会觉得看书、看资料可以轻松很多。
如果你是一个上班族,但是刚刚学习编程,可能学c和c++对你来说有些复杂和困难,因为学习它们确实是很需要时间。你们不像在校生那样有大把的连续时间,而零碎的时间去学习一个比较复杂的东西效果不见得有那么好,所以可以先学一些【更容易见效】的编程语言,从python入手吧,至少能快速做出一些小应用,不至于丢失了兴趣,但是真的要入门编程又还得看看与计算机系统相关的书籍,这样才能更深层次地去编程,譬如【深入理解计算机系统】这一本书可以读很多遍,这本书把整个计算机系统给串起来了。
2.学习编程,我需要学习哪些课程?
我要学哪些课程?我为什么要学习如高数、离散数学、线性代数、概率论等课程?
这个问题也是之前困扰了我很久的问题。不过我现在想通了,对于【高数、离散、线性代数、概率论】等课程,很好解释,做算法的同学肯定知道为啥要学习这些课程。机器学习中会大量用到上述提到的课程,所以会比较好理解。对在校生而言,学校开设的很多课程我们不知道为什么要学,我们很疑惑,不知道学它有什么用,这个时候我们就会很纠结,还会产生抵触情绪。这很正常,因为我们学习得不够深入,自然不能理解它们的用处。
在我看来,大学本科课程更多的是面向“面”的教学,即什么课程都教给你一些,但是又讲得不那么深入;而工作或者读研,更多的则是面向“点”的学习,用到的知识更专。本科时,学校也不知道你以后是去搞算法、还是搞架构、还是搞服务器开发,甚至去搞硬件,所以学校需要你学很多课程,至少有个了解。对学生来说,一方面可以从中选择自己感兴趣的点;一方面也可以对未来的就业方向有些启发。所以即使像数电、模电等课程,虽然之后可能用不着,但是你也要学,并且会花费大量的时间。虽然你最后不一定去搞硬件,但是这些课程也会让你更容易去理解一些知识,比如cpu中的逻辑器件。
如果你在大一的时候就有一个明确的定位,知道自己今后想从事哪方面的工作,课程与课程之间是可以调一下优先级的。不过像大学物理,这种课程确实是对编程没有帮助,但是像我前面所说的,大学教育更注重广度,大物等课程可能就是为了给你普及生活常识吧。
其实,大学教育的问题是普遍存在的,我认为我们学习一项技能的时候,应该采取的是项目驱动式学习,即需要用到什么东西时不会了再去学,而不是先填鸭式的都填进脑子,并且在学习的过程中我们还不知道它这是干嘛用的,等之后用到了,甚至不记得自己学过,反而查资料才会想起:哦,原来我之前学的xx科目是这个用处啊,可是我当时并没有好好学。很多时候学生时间的浪费可能还是要怪老师、怪学校,他们一开始没给我们做好充分的课程介绍。所以,在经过比较多的编程和项目实践后,我认为一个比较好的学习方式是,改良版的项目驱动学习法。即:
学习一段时间,做个小项目,将做项目遇到的问题记下来,针对性地学习相关知识,然后再实践,再学一段时间理论,让知识成网状发射状地变大。当然,项目驱动式学习有一个弊端,就是每次学习的知识都是项目所需要的,很零碎、不成体系,所以需要改良,即在采取项目驱动学习法的时候每天抽一段时间去完整地读一本书,或者一个相关问题的完整介绍,这样就很容易把一些知识成体系地串起来。这样一段时间下来,慢慢的,你就知道我们为什么要学那么多科目,学这些科目能干什么。
为了表达地更加形象,我就举一个小例子,是我最近遇到的。我本身的工作是做Linux C++的,但不仅限于此。我个人对python、数据分析,以及机器学习等内容比较感兴趣,大家可以看到我最近也在我的专栏发布了很多文章。就从数据获取开始,我讲讲我这两个月做了什么东西。
谈到数据获取,可能最容易想到的是爬虫,爬虫是一个在知乎上被说烂了的话题,所以我不想多说它是什么。很多时候有人觉得爬虫简单,为什么呢,因为有现成的框架,所以获取少量的数据就比较容易。但是当你需要爬取的数据很大的时候(比如我之前抓取了知乎500万用户的数据,在下班的时间、用自己家里普通的pc,计算机性能并不是那么好,比不上服务器,又要在不被封IP的情况下抓到这么大量的数据,然后对数据进行清洗,最后还要可视化展示),使用现成的爬虫框架就并不是那么容易实现了。况且,我需要抓很多数据源,并不是一锤子买卖。所以我选择去开发一个系统,即在现有的框架下进行二次开发,搭建一个属于自己的爬虫系统,并植入一些算法。我在系统中添加了很多中间件,直到现在,它还可以在10分钟内就部署一个能抓取大量数据的爬虫应用。
❻ 数学与计算机有什么联系
在接触计算机前,就被N多人告知,计算机和数学关系很大;在网上和MM聊天时,当我自称是学计算机的学生时,对方直接曰:那你数学很强咯~~~ 我只能....汗....
因为当时我刚大一,只学了c语言和高数,我实在看不出c语言和高数有什么关系~~
相信这也是很多刚刚学习计算机、编程的同学的问题
在此我给大家说说我的理解,并不一定正确,但相信一定值得你借鉴
首先要说,计算机不等于编程
如果你学过数据结构和计算机组成原理,你就一定明白,编程,只是计算机行业里的一个小分支,你为什么能编写程序?是因为有人已经把更低端的语言直至硬件系统都做好了而要完成后者,就必须懂数学,因为硬件如何有效地形成系统等一系列底层计算机问题,都是通过一个方法来解决的:抽象成数学模型
既然咱这是c++吧,这就不多说了
再次要说,编程是什么
既然学c++了,就一定听过算法这个词,算法是什么,就是每个等待要被计算机解决的问题的方法,我们编程的过程,永远是先看到问题,然后想出办法(即算法),最后由某种语言来在计算机上实现
由此可以看出,语言固然重要,它是把问题计算机化的唯一手段,但算法才是精髓
你编程语言再NB,如果你不懂算法,那么你永远是计算机行业的蓝领
那些懂算法的人甚至可以不懂任何一门编程语言(据说美国有些计算机教授真的不懂任何一门编程语言,他们都是研究数学然后转到了计算机方向),他们把算法用伪码写好,而你的任务此刻更像是个机器----把人家给你的伪码实现
所以如果你学编程只是玩玩,那没关系,只学语言就好而如果你想真正学计算机,哪怕你只是学直接和代码打交道的专业,那有个很重要的工作你必须去做,就是学计算机专业的数学和算法
对于计算机专业的数学,有最基本的这几门:离散数学、线性代数、概率统计
尤其是第一门,和算法、网络联系相当紧密,同时它又是训练逻辑思维的最佳选择!单纯的编程确实可以锻炼逻辑思维,有助于计算机学习,但如果你想系统地、大幅度地提升你的逻辑思维能力,请去学:离散数学!!
学了这几门课后,如果你有任意一门高级语言的基础,那就可以学数据结构和算法了
把以上的都学了,才算是完成了计算机的基础学习(请注意在此过程中编程语言的用处和地位)
当然我绝对不是在说大家都别学c++了,因为只有你懂一门语言,才能把你的逻辑能力实例化,才能进行数据结构和算法的学习
我只是想说,既然学c++,相信大家的智商都不是问题,既然学了c++,就应该以此为基础,去学习更多的东西~~~~
其实我所说的,就是每个大学计算机专业的大一大二的课程安排....
咱吧不是有个帖子是《学习c++的50条忠告》么,就如此贴中说的,不要浮躁,脚踏实地地学习才是王道!不要迷恋最新技术,好好把c、c++(不是那些把什么都封装好的语言譬如java)学好了,就足够你去学别的课程了
❼ 线形代数,离散,概率论,高数分别对计算机编程起什么作用
1.线代、高数、概率数学对计算机编程基本没用处,稍稍有些用的是离散;
2.计算机编程起初主要是为了解决数学计算问题;
3.如果你想解决数学问题,应该要学习这些数学,如果编程是为了其它目的,不学也可以。