要产生随机数,可以使用Java api中java.lang包中的Math类.Math类以静态方法的方式提供常用的数学方法,
其中Math.random()方法是一个可以产生[0.0,1.0]区间内的一个双精度浮点数的方法
如:
产生一个100以内的整数:int x=(int)(Math.random()*100);
又如:
产生一个1-50之间的随机数:int x=1+(int)(Math.random()*50)
也可以使用通用创建对象来获取:
Random random = new Random();
random.nextInt(x);
产生一个0到x-1的正数,如果想产生浮点数有Random类的nextFloat方法,总之nextXXX方法是用来产生随机数的。
B. 随机算法原理
展开专栏
登录
企鹅号小编
5.7K 篇文章
关注
详解各种随机算法
2018-02-06阅读 1.4K0
转自:JarvisChu
之前将的算法都是确定的,即对于相同的输入总对应着相同的输出。但实际中也常常用到不确定的算法,比如随机数生成算法,算法的结果是不确定的,我们称这种算法为(随机)概率算法,分为如下四类:
1、数值概率算法
用于数值问题的求解,通常是近似解
2、蒙特卡洛算法Monte Carlo
能得到问题的一个解,但不一定是正确解,正确的概率依赖于算法运行的时间,算法所用的时间越多,正确的概率也越高。求问题的准确解;
3、拉斯维加斯算法 Las Vegas
不断调用随机算法求解,直到求得正确解或调用次数达到某个阈值。所以,如果能得到解,一定是正确解。
4、舍伍德算法 Sherwood
利用随机算法改造已有算法,使得算法的性能尽量与输入数据无关,即平滑算法的性能。它总能求得问题的一个解,且求得的解总是正确的。
随机数
概述
计算机产生的随机数都是伪随机数,通过线性同余法得到。
方法:产生随机序列
d称为种子;m取值越大越好;m,b互质,常取b为质数;
C. 如何用计算机求随机数
计算机随机数是用一个随机函数生成随机数,但实际上并非无规律,他其实是将一个数通过某种过程生成另一个数,然后将生成的数再次进行此过程,直到出现循环(一定会出现循环),如:
设一个数a;
给a一个值;
对a进行某过程;//此过程一般很复杂
得到b;
再对b进行此过程;
(依次类推)
....
这样的结果是能够得到出现几率几乎相等的一组数,但他们是有规律的,是可以破解的.
但这只是菜鸟所用的"随机数",真正的计算机随机数可以做到随机,
以上面的解释为例,你可以多设几个过程,根据时间决定使用哪个过程,或者把时间也作为一个参数,还有很多方法也可以做到随机,总之,想破解随机数是不可能的.
我是第一个回答的,如果你觉得够详细,就追加点分吧.
D. 求问随机森林算法的简单实现过程
随机森林(Random forest)指的是利用多棵树对样本进行训练并预测的一种分类器。 并且其输出的类别是由个别树输出的类别的众数而定。在机器学习中有一个地位很重要的包scikit-learn可实现随机森林算法。
原理:(随机森林的分类预测和回归预测sklearn.ensemble.RandomForestRegressor方法)
(1)给定训练集S,测试集T,特征维数F。确定参数:使用到的CART的数量t,每棵树的深度d,每个节点使用到的特征数量f,终止条件:节点上最少样本数s,节点上最少的信息增益m,对于第1-t棵树,i=1-t:
(2)从S中有放回的抽取大小和S一样的训练集S(i),作为根节点的样本,从根节点开始训练
(3)如果当前节点上达到终止条件,则设置当前节点为叶子节点,如果是分类问题,该叶子节点的预测输出为当前节点样本集合中数量最多的那一类c(j),概率p为c(j)占当前样本集的比例;如果是回归问题,预测输出为当前节点样本集各个样本值的平均值。然后继续训练其他节点。如果当前节点没有达到终止条件,则从F维特征中无放回的随机选取f维特征。利用这f维特征,寻找分类效果最好的一维特征k及其阈值th,当前节点上样本第k维特征小于th的样本被划分到左节点,其余的被划分到右节点。继续训练其他节点。
(4)重复(2)(3)直到所有节点都训练过了或者被标记为叶子节点。
(5)重复(2),(3),(4)直到所有CART都被训练过。
随机森林的简单实现过程如下:
一、 开发环境、编译环境:
PyCharm Community Edition 2016.2.3
python2.7.10
二、 所用库及安装方法:
pandas[python自带]
sklearn:命令行pip install sklearn;如果没有安装pip,先使用easy_install pip安装pip;如果在MAC上没有权限,使用sudo pip install sklearn;
三、 代码介绍
1. 使用pandas读取本地excel的训练集和测试集,将属性集赋给X_train和Y_train;将要预测的集合赋给X_test和Y_test;
2. 使用DictVectorizer对数据进行规范化、标准化
3. 生成RandomForestRegressor对象,并将训练集传入fit方法中进行训练
4. 调用predict函数进行预测,并将结果存入y_predict变量中;
5. 使用mean_squared_error、score方法输出MSE、NMSE值对拟合度、稳定度进行分析;输出feature_importance,对影响最终结果的属性进行分析;
6. 详细代码见附录
四、 附录
# coding:utf-8
import pandas as pd
data_train = pd.read_excel('/Users/xiaoliu/Desktop/data_train.xlsx')
X_train = data_train[['CPI', 'GDP', 'PPI', 'AJR', 'BJFJ', 'FBDR', 'PCFD', 'PCFDED', 'BDR']]
y_train = data_train['FJ']
data_test = pd.read_excel('/Users/xiaoliu/Desktop/data_test.xlsx')
X_test = data_test[['CPI', 'GDP', 'PPI', 'AJR', 'BJFJ', 'FBDR', 'PCFD', 'PCFDED', 'BDR']]
y_test = data_test['FJ']
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
X_train = vec.fit_transform(X_train.to_dict(orient='records'))
X_test = vec.transform(X_test.to_dict(orient='records'))
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(X_train,y_train)
y_predict = rf.predict(X_test)
print 'predict value:',y_predict
from sklearn.metrics import mean_squared_error
print 'MSE:', mean_squared_error(y_test, y_predict)
print 'NMES:',rf.score(X_test, y_test)
print rf.feature_importances_
E. python中的随机数是怎么实现的
PYTHON中的伪随机数发生器用的是梅森旋转算法。
梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性递归。可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。
梅森旋转算法是R、Python、Ruby、IDL、Free Pascal、PHP、Maple、Matlab、GNU多重精度运算库和GSL的默认伪随机数产生器。从C++11开始,C++也可以使用这种算法。
整个算法主要分为三个阶段:获得基础的梅森旋转链;对于旋转链进行旋转算法;对于旋转算法所得的结果进行处理。
算法实现的过程中,参数的选取取决于梅森素数,故此得名。
梅森素数由梅森数而来。所谓梅森数,是指形如2↑p-1的一类数,其中指数p是素数,常记为Mp 。如果梅森数是素数,就称为梅森素数。
例如4-1=3,8-1=7,16-1=15(不是素数),32-1=31,64-1=63(不是素数)等等。
F. c语言里 random函数怎么实现的
rand函数是根据一个数(我们可以称它为种子)为基准,以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,
但这产生的并不是真意正义上的随机数,是一个伪随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值。
种子相同,产生的随机序列相同。这样做的好处是,方便我们产生一组固定的随机序列,用来调试程序。
C提供了srand()函数,用来设置种子,它的原形是void srand( int a)。
在调用rand函数产生随机数前,应该先利用srand()设好随机数种子,如果未设随机数种子,默认种子为1。
G. random rece命令怎么控制随机
通过Random类。
Random类中实现的随机算法是伪随机也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。(只要种子一样,获取的随机数的序列就是一致的。是一种为随机数的实现,而不是真正的随机数)。
Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。
H. 随机算法的基本概念
随机算法是算法本身包含了随机数生成器的算法。根据《算法导论(中文第二版)》描述,在进行算法分析的时,有时可以在获得了一定输入分布信息之后对输入的分布进行一定的假定,在此基础上进行平均情况分析得到算法的时间复杂度。然而有时候无法获得输入分布的信息,这时可以在算法本身增加一定的随机性,继而实现对算法进行平均情况分析。通过设计随机算法有效地避免较多的较坏情况输入的出现,从而提高算法的平均情况下的性能。
I. 微信红包的随机算法是怎样实现的
当有人在微信群里发了一个 N 人的红包、总金额 M 元,后台大概的技术逻辑如下。
发红包后台操作:
1)在数据库中增加一条红包记录,存储到CKV,设置过期时间;
2)在Cache(可能是腾讯内部kv数据库,基于内存,有落地,有内核态网络处理模块,以内核模块形式提供服务))中增加一条记录,存储抢红包的人数N。
抢红包后台操作:
1)抢红包分为抢和拆:抢操作在Cache层完成,通过原子减操作进行红包数递减,到0就说明抢光了,最终实际进入后台拆操作的量不大,通过操作的分离将无效请求直接挡在Cache层外面。这里的原子减操作并不是真正意义上的原子减操作,是其Cache层提供的CAS,通过比较版本号不断尝试,存在一定程度上的冲突,冲突的用户会放行,让其进入下一步拆的操作,这也解释了为啥有用户抢到了拆开发现领完了的情况。
2)拆红包在数据库完成:通过数据库的事务操作累加已经领取的个数和金额,插入一条领取流水,入账为异步操作,这也解释了为啥在春节期间红包领取后在余额中看不到。拆的时候会实时计算金额,其金额为1分到剩余平均值2倍之间随机数,一个总金额为M元的红包,最大的红包为 M * 2 /N(且不会超过M),当拆了红包后会更新剩余金额和个数。财付通按20万笔每秒入账准备,实际只到8万每秒。
J. 微信红包的随机算法是怎样实现的
RT。我考虑了一个简单的算法:
比如100元,由10个人分,那么平均一个人是10元钱。然后付款后,系统开始分份儿。
第一份:系统由0~10元之间随机一个数,作为这一份的钱数,设x1。
第二份:剩下的钱(100-x1),系统由0~(100-x1)/(10-1)随机一个数,作为这份的钱数,设x2
.。。。
第n份:剩下的钱(100-x1-x2-...-xn),系统由0~(100-x1-x2-...-xn-1)/(10-n)随机一个数,作为这个份的钱数,设为xn
当用户进来拿红包的时候,系统由0~9之间随机一个数,随机到几,就取第几份红包,然后将这个数存到list里。当之后的用户抽到相同的随机数时,则将这个数+1,如遇相同再+1,直至list满,红包发完。