`

[转]java根据概率生成随机数

    博客分类:
  • java
阅读更多

思想什么的可以参看http://blog.csdn.net/slowgrace/archive/2009/03/25/4022632.aspx

 

 

如果要控制1个数落在某个区间的概率,比如要求在sngBegin和sngEnd之间生成一个随机数,这个随机数落在sngPB和sngPE之间的概率是P%。有两种方法,以第二种方法为好。

先说第一种方法,要点是:

(1)由于sngPB和sngPE将整个区间分成3部分,所以先分别计算随机数落在3部分的概率。落在sngPB和sngPE之间的概率是P%,这是已知的。余下的两个区间的总和概率是(1-p%),分到各个区间的概率按它们的长度分成。

(2)然后根据3个概率得到一个区间划分,落在第一个区间的,就在sngPB和sngPE之间生成一个随机数;落在第二个区间的,就是[sngBegin, sngPB]里生成随机数;落在第3个区间的,就在[sngPE,sngEnd]之间生数。  

 

这个办法有个问题,就是用了两次随机数,这样实际上影响了它的随机性。Tiger_Zhao建议的第二种方法则没有这个问题,做法是:多个段有不同权重时其实可以映射成相同权重(缩放 [sngPB, sngPE] 区间,相对调整 sngEnd),这样只要一次 Rnd() 就可以完成,代码如下。

 

	Random rand = new Random();
	
	public static void main (String args[]) {
		
		double bytP = 0.01;
		double sngBegin = 1;
		double sngEnd = 5;
		double sngPB = 2;
		double sngPE = 3;
        
        Rand r = new Rand();
        
        for (int i = 0; i < 1000; i++) {
        	
        	System.out.println(r.GetRndNumP(sngBegin, sngEnd, sngPB, sngPE, bytP));
        }
	}
	
    /**
     * 按照一定概率进行随机<br>
     * <br>
     * @param pSngBegin 随机数范围的开始数字
     * @param pSngEnd 随机数范围结束数字
     * @param pSngPB 要随机的数字的开始数字
     * @param pSngPE 要随机的数字的结束数字
     * @param pBytP 要随机的数字随机概率
     * @return 按照一定概率随机的数字
     */
	public double GetRndNumP(double pSngBegin, 
			                 double pSngEnd, 
			                 double pSngPB, 
			                 double pSngPE, 
			                 double pBytP) {
		
		double sngPLen;
		
		double sngTLen; //total length
		
		double sngIncreased; //需要缩放的长度
		
		double sngResult;
		
		sngPLen = pSngPE - pSngPB;
		
	    sngTLen = pSngEnd - pSngBegin;
	    
	    if ((sngPLen / sngTLen) * 100 == pBytP ) {
	    	
	    	return GetRandomNum(pSngBegin, pSngEnd);
	    	
	    } else {
	    	
	    	// ((sngPLen + sngIncreased) / (sngTLen + sngIncreased)) * 100 = bytP
	    	sngIncreased = ((pBytP / 100) * sngTLen - sngPLen) / (1 - (pBytP / 100));
	    	
	    	// 缩放回原来区间
	        sngResult = GetRandomNum(pSngBegin, pSngEnd + sngIncreased);
	    	
	    	if (pSngBegin <= sngResult && sngResult <= pSngPB) {
	    		
	    		return sngResult;
	    		
	    	} else if (pSngPB <= sngResult && sngResult <= (pSngPE + sngIncreased)) {
	    		
	    		return pSngPB + (sngResult - pSngPB) * sngPLen / (sngPLen + sngIncreased);
	    		
	    	} else if ((pSngPE + sngIncreased) <= sngResult && sngResult <= (pSngEnd + sngIncreased )) {
	    		
	    		return sngResult - sngIncreased;
	    		
	    	}
	    }
	    
	    return 0f;

	}
	
	public double GetRandomNum(double pSngBegin, double pSngEnd) {
		
		return (pSngEnd - pSngBegin) * Math.random() + pSngBegin;
	}
 

原文链接:http://blog.csdn.net/a9529lty/article/details/4993232

分享到:
评论

相关推荐

    java根据比例概率生成随机数

    Java 根据比例概率生成随机数 概率随机数是指根据事先设定的概率分布生成随机数的方法。在 Java 中,可以使用 Math.random() 方法生成随机数,然后根据概率分布判断返回的数字。 在给定的代码中,作者定义了一个 ...

    JAVA 根据设置的概率生成随机数的方法

    JAVA 根据设置的概率生成随机数的方法 JAVA 根据设置的概率生成随机数的方法是指根据预先设置的概率来生成随机数的技术。这种方法广泛应用于游戏、模拟、科学计算、数据分析等领域,在实际应用中可以模拟真实世界中...

    JAVA 生成随机数并根据后台概率灵活生成的实例代码

    JAVA 生成随机数并根据后台概率灵活生成的实例代码 通过这篇文章,我们可以了解如何使用 JAVA 生成随机数,并根据后台概率灵活生成实例代码。这种技术在实际业务中非常有用,例如大转盘的业务,奖品可根据数据后台...

    java用法StdRandom生成随机数_.docx

    "Java StdRandom类用于生成随机数" StdRandom类是Java语言中用于生成随机数的工具类,提供了一系列的静态方法来满足不同用例的需求。该类的主要功能是生成随机数,包括基本的随机数、uniform分布随机数、bernoulli...

    生成随机数小程序

    本项目名为“生成随机数小程序”,它提供了一个便捷的工具,能够根据用户需求生成指定数量的随机数,并将这些数字导出到TXT文本文件中。下面将详细探讨这个小程序的功能、实现方式以及可能的应用场景。 首先,...

    java生成随机数

    在Java编程语言中,生成随机数是一项常见的任务,可以用于各种场景,比如模拟随机事件、游戏编程、测试等。Java提供了多种方式来生成随机数,其中最常用的是`java.util.Random`类。在这个主题中,我们将深入探讨如何...

    java 随机数的资源

    在Java编程语言中,随机数的应用非常广泛...总之,Java提供了多种生成随机数的方式,可以根据需求选择合适的类和方法。在实际应用中,理解这些随机数生成器的工作原理和使用技巧,将有助于编写出更加高效和可靠的代码。

    Java环境下各种分布随机数的生成研究与实现.pdf

    在Java语言中,可以利用java.util.Random类来生成随机数。若想生成[0, N)区间的随机数,可以调用Random类的nextInt(N)方法。Random类内部采用线性同余法生成随机数,其内部实现包含一个种子值,通过一系列操作不断...

    java学习资料-实例解析常用Java随机数生成

    Java是一种广泛使用的编程语言,它的功能丰富,包括生成随机数的能力。在Java中,生成随机数主要有两种方式:使用`Math.random()`方法和`java.util.Random`类。 1. **Math.random()方法**: `Math.random()`是Java...

    介绍java 产生随机数式

    在Java编程语言中,生成随机数是一项常见的任务,可以用于各种场景,如模拟随机事件、游戏开发、测试等。本文将深入探讨Java如何生成随机数,并提供相关代码示例。 首先,Java提供了`java.util.Random`类来生成...

    比线性同余法更好的生成随机数的方法

    通过比较,可以看到使用随机数池法和蒙特卡罗法得到的π值(3.14)比使用线性同余法生成的伪随机数得到的π值(3.22)更为准确,显示了这种方法在生成随机数质量上的优势。 总结来说,线性同余法虽然简单,但在需要...

    抽奖随机数算法java

    首先,Java提供了`java.util.Random`类用于生成随机数。该类提供了多种方法,如`nextInt()`、`nextDouble()`等,可以生成指定范围内的整数或浮点数。在抽奖场景中,我们通常会用到`nextInt()`来生成整数,例如在1到n...

    Java生成随机数的2种示例方法代码

    在Java编程语言中,生成随机数是常见的需求,可以用于各种场景,如模拟、测试、游戏等。这里我们将详细介绍两种生成随机数的方法:使用`Random`类和`Math`类的`random()`方法。 首先,我们来看使用`Random`类的方法...

    Java实现按权重随机数

    Java实现按权重随机数是一种在编程中常见的需求,特别是在模拟、游戏开发或算法设计中,我们需要根据不同的权重来决定某个事件发生的概率。本篇将详细解释如何在Java中有效地实现这个功能。 首先,我们来看问题定义...

    java随机数生成具体实现代码

    在Java编程语言中,生成随机数是一项常见的任务,可以用于各种场景,如模拟、测试、游戏等。在Java中,可以使用`java.util.Random`类来生成随机数。以下是一篇关于Java随机数生成的详细解释,以及一个具体的实现代码...

    java实现刮刮卡大转盘等中奖概率的简单实例

    在Java中,我们可以使用`java.util.Random`类来生成随机数,以模拟随机事件。 1. **随机数生成**: - `Random`类提供了多种生成随机数的方法,如`nextInt(int bound)`用于生成指定范围内的整数,`nextDouble()`...

    随机数生成工具

    5. **编程语言实现**:几乎所有的编程语言都有内置的随机数生成函数,如Python的`random`模块,Java的`java.util.Random`类,JavaScript的`Math.random()`等。用户可以根据需求选择合适的方法生成整数、浮点数,甚至...

    java中使用随机数发生器

    在Java编程语言中,`Random`类是生成随机数的核心工具,它位于`java.util`包下。`Random`类提供了多种方法来生成不同类型的随机数,如整数、浮点数以及布尔值,这对于各种应用程序,特别是模拟、游戏、加密等领域来...

    java随机数.pdf

    Java提供了多种生成随机数的方法,主要集中在`System`类、`Math`类以及`Random`类中。 一、Java随机数生成方式 1. `System.currentTimeMillis()`:返回当前系统时间的毫秒数,这是一个长整型(`long`)数值,可以...

    java随机数加法

    在Java编程语言中,生成随机数并进行加法运算是一项基础但重要的技能,尤其是在开发涉及概率计算、模拟或游戏逻辑的程序时。本教程将详细解释如何在Java中生成随机数以及如何执行加法操作。 首先,让我们了解如何在...

Global site tag (gtag.js) - Google Analytics