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

java概率演算法

發布時間:2023-03-09 19:56:39

『壹』 求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;
}

}

『貳』 JAVA抽獎的演算法

那你可以再1-10000之間隨即嘛,概率小的獎品設置為1-10,概率大的設置為11-1000,最後隨即出來的數判斷一下在那個區間就可以了.
實體類,就是寫一個JAVA BEAN嘛,裡面記載獎品名字和數量啊,不懂可以追問

『叄』 如何用概率演算法求根號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的概率演算法

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 + "]";
}

}
//本質還是隨機數

『伍』 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問題而是一個數學問題

『陸』 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]);
}
}

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

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

『捌』 用Java寫一個演算法,把一串數字,所有可能的和按順序排列,並計算每個和出現的次數

樓主你好

應你的要求 我只做了加一位的和加兩位的
演算法類代碼如下:
public class CountSumClass {
private String number;
private String result = new String("");
public CountSumClass() {
number = new String();
}
public CountSumClass(String str) {
number = str;
}
public String getResult() {
return result;
}
public void addOne() {
int x,y;
for (int i = 0; i < number.length()-1; i++) {
x = (int)number.charAt(i) - 48;
for(int j = i+1; j<number.length(); j++) {
y = (int)number.charAt(j) - 48;
result += x+"+"+y+"="+(x+y)+"\n";
}
}
y=0;
for (int i = 0; i<number.length(); i++) {
x = (int)number.charAt(i) - 48;
y += x;
if(i == number.length()- 1) {
result += x+"="+y;
} else {
result += x+"+";
}
}
}
public void addTwo() {
int x,y,z;
result += "\n";
for (int i = 0; i<number.length()-1; i++) {
String substr = number.substring(i,i+2);
x = Integer.parseInt(substr);
z = (x%10) * 10 + (x/10);
for(int j=0; j<number.length(); j++) {
if(j!=i && j!=i+1) {
y = (int)number.charAt(j) - 48;
result += x+"+"+y+"="+(x+y)+"\n";
result += z+"+"+y+"="+(z+y)+"\n";
}
}
}
}
public String toString() {
return result;
}
}

希望能幫助你哈

閱讀全文

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

熱點內容
idea查找項目所在文件夾 瀏覽:161
程序員的電腦硬碟清理 瀏覽:686
安卓手機照片太多內存不夠怎麼辦 瀏覽:956
施工命令號 瀏覽:59
javajpgtiff 瀏覽:869
忻奇醫用靜脈曲張壓縮襪 瀏覽:892
寧國壓縮泡沫板 瀏覽:955
速8屬於什麼app 瀏覽:604
小米8手機照片視頻文件夾 瀏覽:716
現代製造技術pdf 瀏覽:652
winftp命令大全 瀏覽:930
海南超市送貨有什麼app 瀏覽:576
迷你編程怎樣切換賬號 瀏覽:754
網路工程師ping命令 瀏覽:152
手機迅雷怎麼下載解壓視頻 瀏覽:57
java多線程編程總結 瀏覽:873
什麼app拍視頻的時候可以修腿 瀏覽:811
什麼app跨國轉賬 瀏覽:120
空調小壓縮機貼大標簽 瀏覽:696
冰凍壓縮牛肉 瀏覽:500