導航:首頁 > 編程語言 > 概率演算法java

概率演算法java

發布時間:2022-05-22 02:34:18

A. 抽獎概率的計算

/*
* 下面方法是在考慮獎項有名額限制的情況下
* 暫定一等獎1名 二等獎 2名 3等級3名 幸運獎10名
* 中獎方法適用math.random(1000)
*/
Integer one = 1;
Integer two = 2;
Integer three = 3;
Integer lucky = 10;
public Integer Lottery(){//返回值:1-一等獎 2-二等獎 3-三等獎 4-幸運獎 0-不中獎
Integer ranNum = (int)(Math.random()*1000);
System.out.println(ranNum);
if(ranNum>=0&&ranNum<10)//獲獎范圍內
{
if(ranNum==0)//獲得0 概率為0.1%
{
if(one>0)
{
one--;
return 1;
}
if(two>0)
{
two--;
return 2;
}
if(three>0)
{
three--;
return 3;
}
if(lucky>0)
{
lucky--;
return 4;
}
}

if(ranNum>=0&&ranNum<2)
{
if(two>0)
{
two--;
return 2;
}
if(three>0)
{
three--;
return 3;
}
if(lucky>0)
{
lucky--;
return 4;
}
}

if(ranNum>=0&&ranNum<5)
{

if(three>0)
{
three--;
return 3;
}
if(lucky>0)
{
lucky--;
return 4;
}
}

if(lucky>0)
{
lucky--;
return 4;
}
}

return 0;
}

B. java編程 怎麼判斷它是質數 高手仔細講下判斷原因 初學者

如果數比較小,那就一個數一個數的除,很容易知道一個數是不是質數
比如我從2開始,除2,除3,除4。。。一個一個的除看有沒有餘數
但是如果數比較大,比方說幾百位長,上千位長,那這種方法是算不過來的
java中BigInteger類有個isProbablePrime可以來判斷某個數是否是質數,不過也是比較粗略的
當然對於小的數很容易遍歷出來
public static boolean isPrime(int n) {
if((n%2) == 0) return false;
for(int i=3; i*i<=n; i+=2){
if(n%i==0)
return false;
}
return true;
}
大的可以用Miller-Rabin素數測試和Lucas-Lehmer測試,它是一個概率演算法,返回的結果:一個數不是素數或者一個數可能是素數。
其實這都不是一個簡單的java問題而是一個數學問題

C. java隨機生成1-100之間的數10000次,計算出88出現得概率

package zhangyw.test;

import java.util.Random;

public class T {

public static void main(String[] args) throws Exception {
int count = 0;
Random random = new Random();
for (int i = 0; i < 10000; i++) {
int value = random.nextInt(100) + 1; //nextInt方法返回的值在0-99之間,所以需要加1
if (value == 88) {
count++;
}
}

System.out.println(count / 100.0 + "%");
}

}

D. 求一段JAVA的概率演算法

public class Zhuq {
public static void main(String[] args) {
List<Person> listP=new ArrayList<Person>();
listP.add(new Person("小李", "1", 200));
listP.add(new Person("小王", "2", 210));
listP.add(new Person("小趙", "3", 230));
listP.add(new Person("小孫", "4", 100));
listP.add(new Person("小錢", "5", 3));
listP.sort(new Comparator<Person>() {

@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return (((Person)o1).count)*(Math.random()*10+1)>(((Person)o2).count)*(Math.random()*10+1)?-1:1;
}
});
System.out.println(listP);
}
}

class Person {
String personName;
String id;
int count;

public Person(String personName, String id, int count) {
super();
this.personName = personName;
this.id = id;
this.count = count;
}
@Override
public String toString() {
return "Person [personName=" + personName + ", id=" + id + ", count=" + count + "]";
}

}
//本質還是隨機數

E. JAVA中如何實現概率演算法,比如打架小游戲,普通攻擊概率為80%,暴擊為20%。 謝謝啦

幾率的演算法,大家不信可以進游戲看看自己各種技能傷害加成是不是這樣,例如鳥的大招... 覺醒+自身一共20%暴,2+4暴擊套30%,這就是50%了

F. 概率 Java

想多了,java寫出的雙色球程序,紅藍球都只是一個限定范圍的隨機數,是不會有所謂出現的概率的。
演算法只是取個隨機數而已。靠什麼想像。只能說能算出每個號的概率,不過是沒有意義的,,因為都很小,而且一個雙色球搖獎機罷了,國內生產最多幾 W,為啥體彩中心是進口的幾百W的設備,會多什麼功能,你們自己都懂的

G. java中求概率怎麼計算

我校的計算機專業介紹:
計算機科學與技術
計算機科學與技術專業面向國民經濟信息化建設和發展的需要,培養具有良好的政治素質和科學素養,系統地掌握計算機科學與技術,包括計算機硬體、軟體與應用的基本理論、基本知識和基本技能與方法,能在科研部門、教育部門、企事業單位、技術和行政管理部門等單位從事計算機教學、科學研究和工程應用的計算機科學與技術高級人才。主要課程有:高等數學、英語、模擬電子技術、數字邏輯、計算機原理、微型計算機技術、高級語言、匯編語言、數據結構、操作系統、資料庫原理、軟體工程、編譯原理、計算機系統結構、通信系統原理、計算機圖像處理、計算機網路、區域網工程、網路安全、電子商務、多媒體技術與應用、JAVA程序設計、計算機輔助設計等。該專業培養四年制普通本科生和民辦本科生。
軟體工程軟體工程專業面向國民經濟信息化建設和發展的需要,培養具有扎實的計算機軟體基礎、較強的軟體開發和專業綜合實踐能力,並具備軟體工程管理知識,具有團隊合作素質,能在科研和教育部門、企事業單位、技術和行政管理部門中從事軟體研發、管理和服務等工作,具有創新精神的軟體工程技術人才和管理人才。主要課程有:高等數學、英語、離散數學、概率論與數理統計、C語言程序設計、面向對象程序設計、匯編語言、數據結構、資料庫原理、操作系統、計算機網路、網路安全、軟體工程、軟體體系結構、軟體測試技術、軟體成熟度模型、軟體質量控制、實用軟體工程與項目管理、嵌入式軟體設計、統一建模語言(UML)、人機交互設計、分布式系統、INTERNET程序設計、數據倉庫與數據挖掘等。該專業培養四年制普通本科生和民辦本科生。
網路工程網路工程本科專業培養基礎扎實、知識面寬、實踐應用能力強、綜合素質高、適應信息時代要求的德、智、體、美全面發展的復合型網路工程高級技術人才。學生畢業後,可在政府機關、學校及其他企、事業單位從事計算機網路系統的規劃與設計、網路工程的組織及實施、網路運行管理和分析、網路應用開發以及網路教學等工作。主要課程有:高等數學、英語、線性代數、概率論與數理統計、信號與系統、數據通信原理、計算機網路基礎、網路操作系統、TCP/IP協議、協議分析、區域網工程、網際網路及其應用、網路安全、入侵檢測技術、網路系統設計與集成、Unix操作系統及應用、網路管理與維護、面向對象程序設計、數據結構、資料庫系統與應用、Web技術與應用等。該專業培養四年制普通本科生和民辦本科生。

H. 求java演算法:根據物品的數量來確定抽獎的概率(當物品數量為0時無論如何都不可能選到)

public class Lottery {

private int m = 1000;//發放獎券的數量
private int n = 2;//獎品的數量

public boolean getLottery(){
boolean isLottery = false;
double d = (double)n/(double)m;//中獎概率
double r = Math.random();//0~1之間的隨機數,包括0
if(r<d){//如果隨機數小於概率 那麼中獎
n--;//獎品數量-1
isLottery = true;
}
m--;//獎券數量-1
return isLottery;
}

}

I. Java怎麼用線性同餘法跟取余法一起產生一個序列。

亂數是不重復的隨機數嗎?

很多演算法的每一個計算步驟都是固定的,而在下面我們要討論的概率演算法,允許演算法在執行的過程中隨機選擇下一個計算步驟。許多情況下,當演算法在執行過程中面臨一個選擇時,隨機性選擇常比最優選擇省時。因此概率演算法可在很大程度上降低演算法的復雜度。
概率演算法的一個基本特徵是對所求解問題的同一實例用同一概率演算法求解兩次可能得到完全不同的效果。這兩次求解問題所需的時間甚至所得到的結果可能會有相當大的差別。一般情況下,可將概率演算法大致分為四類:數值概率演算法,蒙特卡羅(Monte Carlo)演算法,拉斯維加斯(Las Vegas)演算法和舍伍德(Sherwood)演算法。
數值概率演算法常用於數值問題的求解。這類演算法所得到的往往是近似解。而且近似解的精度隨計算時間的增加不斷提高。在許多情況下,要計算出問題的精確解是不可能或沒有必要的,因此用數值概率演算法可得到相當滿意的解。
蒙特卡羅演算法用於求問題的准確解。對於許多問題來說,近似解毫無意義。例如,一個判定問題其解為「是」或「否」,二者必居其一,不存在任何近似解答。又如,我們要求一個整數的因子時所給出的解答必須是准確的,一個整數的近似因子沒有任何意義。用蒙特卡羅演算法能求得問題的一個解,但這個解未必是正確的。求得正確解的概率依賴於演算法所用的時間。演算法所用的時間越多,得到正確解的概率就越高。蒙特卡羅演算法的主要缺點就在於此。一般情況下,無法有效判斷得到的解是否肯定正確。
拉斯維加斯演算法不會得到不正確的解,一旦用拉斯維加斯演算法找到一個解,那麼這個解肯定是正確的。但是有時候用拉斯維加斯演算法可能找不到解。與蒙特卡羅演算法類似。拉斯維加斯演算法得到正確解的概率隨著它用的計算時間的增加而提高。對於所求解問題的任一實例,用同一拉斯維加斯演算法反復對該實例求解足夠多次,可使求解失效的概率任意小。
舍伍德演算法總能求得問題的一個解,且所求得的解總是正確的。當一個確定性演算法在最壞情況下的計算復雜性與其在平均情況下的計算復雜性有較大差別時,可以在這個確定演算法中引入隨機性將它改造成一個舍伍德演算法,消除或減少問題的好壞實例間的這種差別。舍伍德演算法精髓不是避免演算法的最壞情況行為,而是設法消除這種最壞行為與特定實例之間的關聯性。
本文簡要的介紹一下數值概率演算法和舍伍德演算法。
首先來談談隨機數。隨機數在概率演算法設計中扮演著十分重要的角色。在現實計算機上無法產生真正的隨機數,因此在概率演算法中使用的隨機數都是一定程度上隨機的,即偽隨機數。
產生隨機數最常用的方法是線性同餘法。由線性同餘法產生的隨機序列a1,a2,...,an滿足
a0=d
an=(ban-1+c)mod m n=1,2.......
其中,b>=0, c>=0, d>=m。d稱為該隨機序列的種子。
下面我們建立一個隨機數類RadomNumber,該類包含一個由用戶初始化的種子randSeed。給定種子之後,既可產生與之相應的隨機數序列。randseed是一個無符號長整型數,既可由用戶指定也可由系統時間自動產生。
const unsigned long maxshort=65536L;
const unsigned long multiplier=1194211693L;
const unsigned long adder=12345L;
class RandomNumber
{
private:
//當前種子
unsigned long randseed;
public:
//構造函數,預設值0表示由系統自動產生種子
RandomNumber(unsigned long s=0);
//產生0-n-1之間的隨機整數
unsigned short Random(unsigned long n);
//產生[0,1)之間的隨機實數
double fRandom(void);
};
RandomNumber::RandomNumber(unsigned long s)
{
if(s==0)
randseed=time(0);
else
randseed=s;
}
unsigned short RandomNumber::Random(unsigned long n)
{
randseed=multiplier*randseed+adder;
return (unsigned short)((randseed>>16)%n);
}
double RandomNumber::fRandom(void)
{
return Random(maxshort)/double(maxshort);
}
函數Random在每次計算時,用線性同餘式計算新的種子。它的高16位的隨機性較好,將randseed右移16位得到一個0-65535之間的隨機整數然後再將此隨機整數映射到0-n-1范圍內。
對於函數fRandom,先用Random(maxshort)產生一個0-(maxshort-1之間的整型隨機序列),將每個整型隨機數除以maxshort,就得到[0,1)區間中的隨機實數。
下面來看看數值概率演算法的兩個例子:
1.用隨機投點法計算π
設有一半徑為r的圓及其外切四邊形,如圖所示。向該正方形隨機投擲n個點。設落入圓內的點在正方形上均勻分布,因而所投入點落入圓內的概率為 πr^2/4r^2,所以當n足夠大時,k與n之比就逼近這一概率,即π/4。由此可得使用隨機投點法計算π值的數值概率演算法。具體實現時,只需要在第一次象限計算即可。

double Darts(int n)
{
static RandomNumber dart;
int k=0;
for(int i=1;i<=n;i++){
double x=dart.fRandom();
double y=dart.fRandom();
if((x*x+y*y)<1)
k++;
}
return 4*k/double(n);
}
再簡單舉個舍伍德演算法的例子。
我們在分析一個演算法在平均情況下的計算復雜性時,通常假定演算法的輸入數據服從某一特定的概率分布。例如,在輸入數據是均勻分布時,快速排序演算法所需的平均時間是O(n logn)。但是如果其輸入已經基本上排好序時,所用時間就大大增加了。此時,可採用舍伍德演算法消除演算法所需計算時間與輸入實例間的這種聯系。
在這里,我們用舍伍德型選擇演算法隨機的選擇一個數組元素作為劃分標准。這樣既能保證演算法的線性時間平均性能又避免了計算擬中位數的麻煩。非遞歸的舍伍德型演算法可描述如下:
template<class Type>
Type select(Type a[], int l, int r, int k)
{
static RandomNumber rnd;
while(true){
if(l>=r)
return a[l];
int i=l, j=l=rnd.Random(r-l+1);
Swap(a[i], a[j]);
j=r+1;
Type pivot=a[l];
while(true)
{
while(a[++i]<pivot);
while(a[--j]>pivot);
if(i>=j)
break;
Swap(a[i], a[j]);
}
if(j-l+1==k)
return pivot;
a[l]=a[j];
a[j]=pivot;
if(j-l+1<k)
{
k=k-j+l-1;
l=j+1;
}
else
r=j-1;
}
}
template <class Type>
Type Select(Type a[], int n, int k)
{
if(k<1||k>n)
throw OutOfBounds();
return select(a, 0, n-1, k);
}
平時我們一般開始考慮的是一個有著很好平均性能的選擇演算法,但在最壞情況下對某些實例演算法效率較低。這時候我們用概率演算法,將上述演算法改造成一個舍伍德型演算法,使得該演算法對任何實例均有效。
不過在有些情況下,所給的確定性演算法無法直接改造成舍伍德型演算法。這時候就可以藉助隨機預處理技術,不改變原有的確定性演算法,僅對其輸入進行隨機洗牌,同樣可以得到舍伍德演算法的效果。還是剛才的例子,換一種方法實現:
template<class Type>
void Shuffle(Type a[], int n)
{
static RandomNumber rnd;
for(int i=1;i<n;i++){
int j=rnd.Random(n-i)+i;
Swap(a[i], a[j]);
}
}

J. 如何用概率演算法求根號2

想了一段時間,有一個方法,但不是太好需要使用圓周率PI!

原理:
在一個邊長為1的正方形內,求下面的積分,
積分上下限為0和pi/4,被積函數為sinX
積分結果是(1-根號2/2)
應用蒙特卡羅模擬,落入上述函數內的次數為N,共試驗M次,則有:
(1-根號2/2)= N/M,那麼
根號2 = 2*(1-N/M)

java代碼:
public static void main(String[] args) {
int CONSTANT = 1000000;

java.util.Random rnd1 = new java.util.Random(System.currentTimeMillis());
java.util.Random rnd2 = new java.util.Random(System.currentTimeMillis() / rnd1.nextLong());

int count = 0;

for(int i = 0; i < CONSTANT; i++) {
double x = rnd1.nextDouble();
double y = rnd2.nextDouble();

if(x > Math.PI / 4) {
continue;
}

if(Math.sin(x) < y) {
continue;
}

count++;
}

double value = (1 - 1.0 * count / CONSTANT) * 2;

System.out.println(value);
}

我再想想有什麼其他方法,不用PI的!

閱讀全文

與概率演算法java相關的資料

熱點內容
貴陽螺桿壓縮冷凝機組組成 瀏覽:115
掃描製作pdf 瀏覽:515
2016奇駿車機如何安裝app 瀏覽:764
phpvc9x64 瀏覽:73
蜜語星球解壓 瀏覽:476
c語言編譯器怎麼打不開 瀏覽:818
海印程序員 瀏覽:648
為什麼華為手機找不到伺服器 瀏覽:664
pdf增減 瀏覽:608
雲伺服器怎麼公網架設網站 瀏覽:91
pythonrequests慢 瀏覽:140
excel保存沒有pdf 瀏覽:922
冰箱壓縮機管囗示意圖 瀏覽:497
許振民編譯局 瀏覽:625
雙網路加什麼伺服器好用 瀏覽:211
linux命令中文 瀏覽:839
python怎麼做物聯網 瀏覽:731
app有什麼推薦嗎 瀏覽:79
自學程序員能不能面試工作 瀏覽:879
有錢人的解壓方法 瀏覽:84