如何生成隨機數,這將提供關於劃分正確的結果正確的結果(即結果應全面準確小數點後1米或2處)。如何生成隨機數,這將提供關於劃分
(例如一個整數通過提供小數結果的十進制數 - 我已經給定一組的以下樣品輸入)
2827 by 2.5 = 1130.8
1747 by 0.8 = 2183.75
425 by 0.4 = 1062.5
935 by 0.8 = 1168.75
如何生成隨機數,這將提供關於劃分正確的結果正確的結果(即結果應全面準確小數點後1米或2處)。如何生成隨機數,這將提供關於劃分
(例如一個整數通過提供小數結果的十進制數 - 我已經給定一組的以下樣品輸入)
2827 by 2.5 = 1130.8
1747 by 0.8 = 2183.75
425 by 0.4 = 1062.5
935 by 0.8 = 1168.75
值得一提的是,所有的整數可以通過0.4,0.8或2.5被劃分並表示爲小數點後兩位。這是因爲它是一樣的2.5,1.25乘以0.4
但是,如果你有一個除數其中,這是不正確的,你可以在一個循環做到這一點。
double divisor = 2.4;
double factor = 100/divisor;
Random rand = new Random();
int maxValue = 1000;
double ERROR = 1e-14*maxValue;
for(int i=0;i<100;i++) {
long randNum;
do {
randNum = rand.nextInt(maxValue+1);
if (Math.abs(randNum * factor - (long) (randNum * factor)) > ERROR)
System.out.println("reject "+randNum + " => "+randNum/divisor);
} while(Math.abs(randNum * factor - (long) (randNum * factor)) > ERROR);
System.out.println(randNum + " => "+randNum/divisor);
打印
729 => 303.75
285 => 118.75
84 => 35.0
123 => 51.25
999 => 416.25
75 => 31.25
reject 727 => 302.9166666666667
reject 842 => 350.83333333333337
504 => 210.0
reject 368 => 153.33333333333334
441 => 183.75
579 => 241.25
165 => 68.75
這將產生隨機數,直到你有一個數是0.01的倍數。
應該如何調用代碼?什麼是解決方案?我只看到整數(randNum:= long)和幾乎整數(randNum *因子)。 '14600.000000000002,38000.0,31300.000000000004,25500.0,11300.0,37900.0 ......'也許我在調用/初始化它錯了? – 2011-05-13 15:42:47
我的猜測是你沒有管理你的舍入錯誤。如果您有導致舍入錯誤的操作,則需要在打印它們時格式化它們。 – 2011-05-13 16:09:23
那麼你只是生產.0,.25,.5和.75?我明白了這個任務,即每一個零分,比如.01,.02,... .89,.99都應該被製作出來,而不僅僅是整個四分之一。 – 2011-05-13 16:59:02
如果你希望結果'舍入'到2位小數(它不是真的四捨五入,它只是一個有限的十進制表示,有兩個小數點),那麼只需要生成除數,並且分數總是100,例如:
106250/100 = 1062.5
116875/100 = 1168.75
如果您想要更有趣的股息,再除以除數和股息。例如第一個可能是任何一個:
(/1): 106250/100 = 1062.5
(/2): 53125/50 = 1062.5
(/10): 10625/10 = 1062.5
(/4): 26562.5/25 = 1062.5
(/125): 850/0.8 = 1062.5
res = input * random.nextInt (100)/100.0;
說明:
你把一個整數n和東西相乘。如果這個數字是34.56這樣的數字,我們稱之爲十進制數w(整個部分)前面的部分和後面的.xy部分。
如果乘以此與正,則結束與(N * W)+(N *(X/10))+ N *(Y/100)。在點後面不會有小數部分的3位密碼 - 你同意嗎?
我們可以結合x和y爲單個零件,並說(N * W)+(N *(XY/100)),和XY僅僅是從0東西100
名稱由於小數點之前的部分可以是任意大的,所以如果你需要的不是0,你可以單獨計算它。但是你必須以某種方式定義一個範圍。如果你對該部分採用隨機整數R:
res = input * R * random.nextInt (100)/100.0;
你需要除數explicityl嗎?
div = 100.0/(R * random.nextInt (100));
斯卡拉總是得心應手,測試代碼fragmenst時:
val r = util.Random
r: util.Random.type = [email protected]
scala> def res (input: Int) = input * r.nextInt (100)/100.0;
res: (input: Int)Double
scala> (1 to 20).map (res)
res338: scala.collection.immutable.IndexedSeq[Double] =
Vector(0.48, 1.58, 0.48, 2.8, 0.15, 1.98, 5.67, 3.36, 6.93, 6.0, 9.02, 0.48, 7.41, 6.44, 9.6, 1.92, 16.66, 5.94, 7.98, 18.4)
對我來說,被除數和除數均爲隨機數。我必須得出一個答案,它不需要舍入小數點後2位的小數。
如果是這樣的話,答案可能是「沒有這樣的數字」。下面是我寫來測試這個假設,一個小Java程序:
import java.text.DecimalFormat;
public class Test {
public static void main(String[] args) {
double num = Math.PI;
DecimalFormat format = new DecimalFormat(
"####################################0." +
"00##############################");
while (true) {
for (int i = 1; i < Integer.MAX_VALUE; i++) {
double tmp = (i/num) * 100;
if (tmp == (long) tmp) {
System.err.println("Solution - " + i + " - " +
format.format(tmp) + " - " + format.format(num));
break;
}
}
pi = Math.nextAfter(num, 1);
}
System.err.println("No solution for " + format.format(num));
}
}
我跑這10分鐘(以PI開始),並沒有發現的num
那有沒有辦法解決i
任何值。但我確實觀察到解決方案可能非常稀少。例如:
Gotcha! - 179453441 - 5712180438.00 - 3.1415926535897714
花了1.79億次嘗試找到該除數的解決方案。
使用setRoundingMode設置舍入模式,然後使用所需輸出的格式模式。
檢查post ....
除數和分紅的範圍是多少? – 2011-05-13 13:47:09
不是答案,所以我將其作爲評論發佈,但請確保您理解本文,因爲它可能會對解決方案產生影響:http://download.oracle.com/docs/cd/E19957-01/ 806-3568/ncg_goldberg.html – JasCav 2011-05-13 13:47:38
這裏的數字是隨機的 - 除數還是分紅?如果你需要精確到1或2個小數位,爲什麼你不能只使用整數,然後再除以100呢? – 2011-05-13 13:50:01