一道筆試題的思考(三)

2021-09-01 12:05:49 字數 1309 閱讀 2188

題目:隨機產生5個數,這5個數每個數的範圍都在[10,35]之間,5個數的和是定值100,盡量讓5個數的概率隨機,寫出演算法??

如,原來a,b,c,d,e都是20,隨機後變成a=34b=29c=11d=10e=16,但是他們之和還是100,再次隨機後a=11b=21c=13d=28e=27,他們的和還是100。

我的解決思路是,第乙個數和第二個數在[10,35]中隨機,後面的數隨機要滿足一定的條件:保證它之後的數隨機後能在[10,35]之間,極端不滿足的情況是前兩個數都隨機到35,那麼後面的三個數只能都是10了,所以第三個數隨機的時候要滿足(100-a-b-c)/2>10||(100-a-b-c)/2<35,否則就要重新隨機。第四個數跟第三個數的處理方式一樣,第五個數是個用100減去前四個數就行。以下是我的實現:

public static void random()

d = r.nextint(25)+10;

while((100-a-b-c-d)<10||(100-a-b-c-d)>35)

e = 100-a-b-c-d;

system.out.println("a="+a+"b="+b+"c="+c+"d="+d+"e="+e);

}

這裡又想起乙個有關隨機的題目:給定乙個函式rand5(),該函式可以隨機生成1-5的整數,且生成概率一樣。現要求使用該函式建構函式rand7(),使函式rand7()可以隨機等概率的生成1-7的整數。

要保證rand7的等概率,就不能利用rand5() + rand()%3來實現rand7()函式,可以這樣思考,首先構造乙個1到n的等概率隨機函式randn(),其中n>7,這樣在randn函式內1-7之間的數肯定也是等概率的,把大於7的數丟棄就ok了。以下是我的**:

//通過rand5隨機1-7之間的數

public static int rand7()

return t%7+1;//這裡把7的整數倍也用求餘的方式對映到1-7.

} //隨機1-5之間的數

public static int rand5()

這裡又有乙個更普遍的題目,通過randn()函式隨機randm()函式,randn是等概率隨機1-n之間的數,randm是等概率隨機1-m之間的數。跟上面的思路一樣,很容易寫出**:

//通過randn隨機1-m之間的數。

public static int randm(int n,int m)

return s%m+1;

} //隨機1-n之間的數

public static int randn(int n)

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道筆試題

題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...