獲取隨機數我有一個函數getrand100()
,它返回一個範圍在1到100之間的隨機數。獲取給定'getrand100()'函數的特定範圍中的隨機數
如何獲得一個範圍內的隨機數1-20和1-200具有相同的功能?
1-20我可以申請:
if(num>=1 && num <=20) then accept else reject
但我應該爲1-200範圍呢?
獲取隨機數我有一個函數getrand100()
,它返回一個範圍在1到100之間的隨機數。獲取給定'getrand100()'函數的特定範圍中的隨機數
如何獲得一個範圍內的隨機數1-20和1-200具有相同的功能?
1-20我可以申請:
if(num>=1 && num <=20) then accept else reject
但我應該爲1-200範圍呢?
我建議
1 + getrand100() % 20
對於第一殼體(20)和
(getrand100()%2)*100 + getrand100()
對於後者(200)。
在C++:
if (getrand100() % 2) return getrand100();
else return getrand100() + 100;
一半將在1-100範圍內(在if
語句)和當時的另一半返回一個數字的時候它會在範圍101-返回一個數字200(else
聲明)。您也可以(如評論中指出的)執行任何類似的條件,例如getrand100() <= 50
。
其實,你可以通過做加快你的答案1-20:
return (getrand100() % 20) + 1;
這樣,您就不必保留拒絕了一系列的解決方案。
或者,如果(getrand100()<= 50)... –
好的亞它是好的答案 –
@DEVANG號我沒有添加'getrand100()%2'。我只是用它來分割獲得'1-100'範圍和'101-200'範圍的可能性。正如我所說的,你也可以使用'getrand100()<= 50'而不是'getrand100()%2'。 – quasiverse
下面是一個廣義Las Vegas-Algorithm:
getRand(int upperBound){
if (upperBound <= 1) { throw new IllegalArgumentException(); }
// TODO: If random set should not start at 1, use another parameter as offset
if (upperBound <= 50) {
int num = getRand100();
while (num > 100 - 100 % upperBound) {
num = getRand100();
}
return num % upperBound + 1;
} else if (upperBound <= 100) {
int num = getRand100();
while (num > upperBound) {
num = getRand100();
}
return num;
} else {
return getRand(upperBound/100) * 100 - 100 + getRand(upperBound % 100);
}
}
使用Java
像這樣的事情會在必要的範圍內產生randomNumber。
int maxLimit=85;
Double someNumber = Math.random()*maxLimit;
int randomNumber=random.intValue(); // return a number from 1 to 85
你的情況,你可以簡單地除以100的方法的結果,然後乘以Java中的maxLimit
(20或200)
的一般解。
public static int rand(int min, int max) {
int range = max - min + 1;
int num = 1;
do {
num = num * 100 + getrand100();
} while (num <= range);
return min + num % range;
}
順便說一句寫在iPhone上的代碼是不容易的;)
刪除了 「-1」。儘管1-20問題相當微不足道,但1-200還是通過使用分辨率Y的隨機性源(其中X> Y)來生成具有給定分辨率X的良好隨機生成器的更一般問題。不是那麼平凡,意見。 –