一种不等概率随机数产生办法
Java实用工具库Java.util中的Random提供了产生各种类型随机的方法,它可以产生int,long,float,double等类型的随机数。例如:
view plaincopy to clipboardprint?
Random rd = new Random();
System.out.println("The set of random numbers:");
System.out.println("Integer:"+rd.nextInt());
System.out.println("Long:"+rd.nextLong());
System.out.println("Float:"+rd.nextFloat());
System.out.println("Double:"+rd.nextDouble());
Random rd = new Random();
System.out.println("The set of random numbers:");
System.out.println("Integer:"+rd.nextInt());
System.out.println("Long:"+rd.nextLong());
System.out.println("Float:"+rd.nextFloat());
System.out.println("Double:"+rd.nextDouble());
运行结果:
view plaincopy to clipboardprint?
The set of random numbers:
Integer:15731478
Long:-6685918349244253815
Float:0.45258975
Double:0.7963162839600346
The set of random numbers:
Integer:15731478
Long:-6685918349244253815
Float:0.45258975
Double:0.7963162839600346
下面来说说等概率随机数产生办法,其实这个很简单,如下函数就已经轻松实现了获得0--max-1之内的等概率随机整数:
view plaincopy to clipboardprint?
private static int getRandInt(int max){
Random rd = new Random();
return Math.abs(rd.nextInt()%max);
}
private static int getRandInt(int max){
Random rd = new Random();
return Math.abs(rd.nextInt()%max);
}
在J2ME手机游戏开发中,经常会使用这种方式获得等概率随机整数。
但是有时在游戏编程中,我们可能需要所获取的随机数概率并不相同,比方说从怪物身上掉落的装备的概率往往是级别愈高,掉落的愈低,反正则愈高。好了让我来把问题抽象为如下编程任务:假定需要产生0到n之间(包括0和n)的随机数,并且要求产生0的概率最大,1次之,2又比1次之,以此类推,n的概率最低。问题清楚了,那么就来考虑一下算法问题,为简单起见,我让产生各个数字的概率等差递减,也就是说,各个随机数的概率之比为:n+1:n:n-1:n-2:......1,那么首先要构造一个区间,区间的下限为0,上限为各个比例数字之和,也就是(n+1)+n+(n-1)+......+1。那么,构造这样一个区间有什么用呢?首先把这个大区间划分为n+1个长度不等的区间,每个小区间的跨度和各个数字的产生概率对应,也就是[0,n](跨度为n+1),[n+1,2n](跨度为n),以此类推,因此这些小区间就代表了各个数字产生的概率。最后在大区间中生成一个等概率随机数x,x落在哪个小区间内,那么就产生代表该区间的那个数字。产生等差递减概率的随机数的思路有了,那么下面的代码就不难理解了:
view plaincopy to clipboardprint?
//获得0--n之内的不等概率随机整数,0概率最大,1次之,以此递减,n最小
private static int getAnyRandInt(int n){
int max = n+1;
int bigend = ((1+max)*max)/2;
Random rd = new Random();
int x = Math.abs(rd.nextInt()%bigend);
int sum = 0;
for(int i = 0; i<max; i++){
sum += (max - i);
if(sum>x){
return i;
}
}
return -1;
}
//获得0--n之内的不等概率随机整数,0概率最大,1次之,以此递减,n最小
private static int getAnyRandInt(int n){
int max = n+1;
int bigend = ((1+max)*max)/2;
Random rd = new Random();
int x = Math.abs(rd.nextInt()%bigend);
int sum = 0;
for(int i = 0; i<max; i++){
sum += (max - i);
if(sum>x){
return i;
}
}
return -1;
}
最后给出我写得一个等概率随机数与不等概率随机数测试与验证程序代码:
view plaincopy to clipboardprint?
import java.util.*;
public class RandomTest {
public static void main(String[] args){
Random ran1 = new Random();
Random ran2 = new Random(12345);
System.out.println("The 1st set of random numbers:");
System.out.println("Integer:"+ran1.nextInt());
System.out.println("Long:"+ran1.nextLong());
System.out.println("Float:"+ran1.nextFloat());
System.out.println("Double:"+ran1.nextDouble());
System.out.println("The 2nd set of random numbers:");
for(int i = 0; i<20; i++){
if(i%5 == 0){
System.out.println();
}
System.out.print(ran2.nextInt()+ " ");
}
int[] rate = new int[10];
System.out.println();
int n = 0;
for(int i = 0; i<200; i++){
if(i%40 == 0){
System.out.println();
}
n = getRandInt(10);
rate[n]++;
System.out.print(n+ " ");
}
displayRandRate(rate, "getRandInt等概率随机数0--9依次出现次数:");
Arrays.fill(rate, 0);
for(int i = 0; i<200; i++){
if(i%40 == 0){
System.out.println();
}
n = getAnyRandInt(9);
rate[n]++;
System.out.print(n+ " ");
}
displayRandRate(rate, "getAnyRandInt不等概率随机数0--9依次出现次数:");
}
//获得0--max-1之内的等概率随机整数
private static int getRandInt(int max){
Random rd = new Random();
return Math.abs(rd.nextInt()%max);
}
//获得0--n之内的不等概率随机整数,0概率最大,1次之,以此递减,n最小
private static int getAnyRandInt(int n){
int max = n+1;
int bigend = ((1+max)*max)/2;
Random rd = new Random();
int x = Math.abs(rd.nextInt()%bigend);
int sum = 0;
for(int i = 0; i<max; i++){
sum += (max - i);
if(sum>x){
return i;
}
}
return -1;
}
private static void displayRandRate(int rate[], String description){
System.out.println();
System.out.println();
System.out.println(description);
for(int i = 0; i<rate.length; i++){
System.out.print(rate[i]+ " ");
}
System.out.println();
}
}
import java.util.*;
public class RandomTest {
public static void main(String[] args){
Random ran1 = new Random();
Random ran2 = new Random(12345);
System.out.println("The 1st set of random numbers:");
System.out.println("Integer:"+ran1.nextInt());
System.out.println("Long:"+ran1.nextLong());
System.out.println("Float:"+ran1.nextFloat());
System.out.println("Double:"+ran1.nextDouble());
System.out.println("The 2nd set of random numbers:");
for(int i = 0; i<20; i++){
if(i%5 == 0){
System.out.println();
}
System.out.print(ran2.nextInt()+ " ");
}
int[] rate = new int[10];
System.out.println();
int n = 0;
for(int i = 0; i<200; i++){
if(i%40 == 0){
System.out.println();
}
n = getRandInt(10);
rate[n]++;
System.out.print(n+ " ");
}
displayRandRate(rate, "getRandInt等概率随机数0--9依次出现次数:");
Arrays.fill(rate, 0);
for(int i = 0; i<200; i++){
if(i%40 == 0){
System.out.println();
}
n = getAnyRandInt(9);
rate[n]++;
System.out.print(n+ " ");
}
displayRandRate(rate, "getAnyRandInt不等概率随机数0--9依次出现次数:");
}
//获得0--max-1之内的等概率随机整数
private static int getRandInt(int max){
Random rd = new Random();
return Math.abs(rd.nextInt()%max);
}
//获得0--n之内的不等概率随机整数,0概率最大,1次之,以此递减,n最小
private static int getAnyRandInt(int n){
int max = n+1;
int bigend = ((1+max)*max)/2;
Random rd = new Random();
int x = Math.abs(rd.nextInt()%bigend);
int sum = 0;
for(int i = 0; i<max; i++){
sum += (max - i);
if(sum>x){
return i;
}
}
return -1;
}
private static void displayRandRate(int rate[], String description){
System.out.println();
System.out.println();
System.out.println(description);
for(int i = 0; i<rate.length; i++){
System.out.print(rate[i]+ " ");
}
System.out.println();
}
}
最后给出该程序某次运行的结果:
The 1st set of random numbers:
Integer:-158150616
Long:8776385264218048298
Float:0.22843891
Double:0.6794943450281173
The 2nd set of random numbers:
1553932502 -2090749135 -287790814 -355989640 -716867186
161804169 1402202751 535445604 1011567003 151766778
1499439034 -51321412 1924478780 -370025683 -1554121271
496460768 679749574 -301730690 -992618231 1128070351
7 7 5 8 8 6 9 5 6 4 5 4 3 8 2 2 3 1 4 0
2 4 9 9 6 5 4 6 1 4 4 0 3 8 8 7 4 2 6 6
3 1 7 8 5 1 0 3 9 4 8 6 1 5 7 7 7 8 0 9
7 1 2 4 4 5 8 1 9 0 7 0 8 2 4 7 9 1 6 7
4 8 9 4 4 5 2 0 2 5 2 3 4 2 2 9 1 4 7 6
3 4 8 5 6 6 2 9 1 4 7 2 6 1 8 5 7 4 0 1
8 2 9 4 9 3 3 6 2 8 2 6 5 0 9 3 4 6 0 1
8 6 7 8 7 6 7 0 0 9 5 8 2 6 5 7 2 5 1 3
9 8 7 4 7 2 2 3 1 0 4 2 0 6 1 1 4 7 4 0
2 8 8 9 6 6 2 1 5 2 4 9 2 6 3 1 3 2 9 5
getRandInt等概率随机数0--9依次出现次数:
15 19 26 14 27 17 22 21 21 18
2 5 6 9 5 2 1 3 0 4 2 4 2 8 1 3 5 0 5 7
2 2 8 5 4 9 8 0 2 0 8 0 0 2 0 2 9 5 0 0
2 3 1 5 0 2 1 4 2 0 7 1 0 5 8 4 3 3 7 7
3 1 3 0 3 3 3 0 0 6 1 1 0 0 6 0 4 6 5 9
2 0 0 4 2 6 1 3 7 2 0 1 1 3 5 1 0 4 0 4
2 7 0 3 6 0 6 2 7 0 9 5 3 0 2 8 5 9 1 1
1 0 5 3 4 2 5 2 1 1 4 2 2 7 7 2 8 5 0 4
8 1 2 3 4 3 1 4 6 5 3 2 2 9 6 0 0 1 2 5
2 9 6 2 2 2 0 2 6 5 6 8 0 0 0 1 0 3 2 6
3 7 5 2 2 1 0 3 0 2 1 0 2 7 2 4 1 3 7 3
getAnyRandInt不等概率随机数0--9依次出现次数:
39 24 38 23 15 19 13 12 9 8
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/loomman/archive/2009/02/03/3861240.aspx
分享到:
相关推荐
- 古典概型是一种概率模型,其特点包括:所有可能的基本事件数量有限,且每个基本事件发生的概率相等。在这种模型下,事件发生的概率可以通过该事件包含的基本事件的数量除以总的基本事件数量来计算。 2. **概率...
在统计学中,不等概率抽样是一种常用的抽样方法,它可以根据总体单元的规模或重要性来确定每个单元的抽样概率。这种方法可以提高抽样策略的统计效率,减少抽样误差。 一、不等概率抽样的必要性 在简单随机抽样中,...
一个高质量的随机数生成器能够产生看似无规律的序列,而且在统计上是均匀分布的。在C和C++编程中,标准库提供了如`<random>`头文件来生成各种分布的随机数,如均匀分布、正态分布等。用户可以通过设置种子来确保可...
这种方法称为蒙特卡洛模拟,是估算复杂概率问题的一种实用技术。 4. **角度与概率的关系**:在第5题中,考虑射线落在特定角度内的概率,这涉及到角度的度量与360度周角的关系。 5. **绝对值不等式表示的区域**:第...
假设在 [1,738] 中等概产生第一个随机数为 354,再在 [1,738] 中产生第二个随机数为 553,最后在 [1,738] 中产生第三个随机数为 493,则它们所对应的第 5,7,6 号单元被抽中。 Mi* 例:假设有 10 个乡,每个乡的...
总结来说,这个压缩包提供的C语言代码实现了一种快速的随机数生成方法,特别是对于正态分布和指数分布,它利用了内联函数和优化的Ziggurat算法。此外,还包含了一个测试程序来确保生成的随机数符合预期的概率分布,...
例如,在题目中的第一个问题中,投掷两颗骰子,所有可能的点数组合是有限的(共有36种),并且每种组合出现的概率都是1/36,因此这是一个古典概型。 第二个问题考察了如何识别古典概型。对于A项,点数之和出现的...
几何概型是一种概率模型,其中事件发生的概率与特定区域的大小成比例。在给定的问题中,我们看到几个涉及几何概型的实例,例如在图形中找到点落在特定区域的概率。 1. 第一题考察的是一个中心对称图形中,随机选取...
7. **计算机随机数生成**:在第10题中,提到利用计算机产生0到1之间的均匀随机数,这是模拟实验或数值计算中常见的方法,事件发生的概率可以通过随机数的分布特性来求解。 8. **概率与不等式**:第11题和第12题中,...
概率模拟方法是一种通过随机抽样来近似计算复杂概率问题的技术,通常涉及到计算机生成的随机数。 在选择题的第一题中,问题涉及到在区间[-1,2]上随机选取一个数x,询问这个数落在区间[0,1]内的概率。解题的关键是...
21. 随机数与概率:第21题的情景未给出,但根据前文的模式,可能涉及到随机数产生的概率问题。 以上是题目中涉及的主要知识点的详细说明,涵盖了概率论与数理统计、几何概型、古典概型、命题逻辑、函数性质、不等式...
1. **几何概型**:几何概型是一种概率模型,它适用于空间、时间或其他连续变量的情况。在几何概型中,事件发生的概率与该事件在总区域中的体积、面积或长度成比例。具体来说,如果事件A发生的区域D的度量(如长度、...
总的来说,这个压缩包提供了一种学习和实践随机数生成、概率统计以及模拟技术的机会。通过理解和运行这些代码,我们可以加深对随机性、概率分布以及统计推断的理解,这对于提升我们的编程技能和解决实际问题的能力都...
几何概型是一种处理连续随机事件的方法,其中事件发生的概率与几何区域的大小成比例。 1. 第一题和第二题是关于几何概型的基本应用,通过比较不同事件所代表的几何区域的大小来计算概率。第一题中,乘客立即乘上车...
正态分布是一种连续概率分布,具有对称性和均值、方差的概念。题目中ξ服从正态分布N(4, σ^2),根据正态分布的性质,可以计算出不同区间的概率。 7. **随机模拟**:随机模拟是通过计算机生成随机数来模拟实际概率...
7. **随机数表法**:第7小题使用随机数表选取彩票号码,这是一种随机抽样的方法,要求掌握随机数表的使用规则。 8. **几何概率**:第8小题是几何概率问题,计算小蝌蚪在特定条件下的概率,涉及到体积比的概念。 9....
2. **随机数表法**:第二题是关于随机抽样,描述了一种利用随机数表选取个体的方法,用于模拟随机选取的过程。在给定的数字序列中,按照指定顺序选取编号。 3. **线性回归**:第三题涉及到线性回归方程,丢失了一个...
5. **蒙特卡洛方法**:这是一种基于概率和统计的数值计算方法,用于解决复杂问题。在会面问题中,通过大量随机生成的到达时间组合,统计满足条件(等待时间不超过10分钟)的比例,从而得到会面概率。 6. **蒲丰投针...
1. 古典概型:古典概型是一种概率模型,它适用于有限个等可能的结果,并且每个结果发生的概率相等的情况。在题目中,例如从1,2,3,4中任取2个不同的数,计算取出的两个数之差的绝对值为2的概率,就是古典概型的应用。...
7. **随机数表抽样**:第七题中用随机数表选取样本,这是统计学中的一种抽样方法,需要理解随机数表的使用规则。 8. **循环结构与算法理解**:第八题是关于程序框图的理解,涉及到循环结构,需要根据流程执行顺序...