2011-05-13 21 views
5

如何生成隨機數,這將提供關於劃分正確的結果正確的結果(即結果應全面準確小數點後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

除數和分紅的範圍是多少? – 2011-05-13 13:47:09

+4

不是答案,所以我將其作爲評論發佈,但請確保您理解本文,因爲它可能會對解決方案產生影響:http://download.oracle.com/docs/cd/E19957-01/ 806-3568/ncg_goldberg.html – JasCav 2011-05-13 13:47:38

+1

這裏的數字是隨機的 - 除數還是分紅?如果你需要精確到1或2個小數位,爲什麼你不能只使用整數,然後再除以100呢? – 2011-05-13 13:50:01

回答

3

值得一提的是,所有的整數可以通過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的倍數。

+0

應該如何調用代碼?什麼是解決方案?我只看到整數(randNum:= long)和幾乎整數(randNum *因子)。 '14600.000000000002,38000.0,31300.000000000004,25500.0,11300.0,37900.0 ......'也許我在調用/初始化它錯了? – 2011-05-13 15:42:47

+0

我的猜測是你沒有管理你的舍入錯誤。如果您有導致舍入錯誤的操作,則需要在打印它們時格式化它們。 – 2011-05-13 16:09:23

+0

那麼你只是生產.0,.25,.5和.75?我明白了這個任務,即每一個零分,比如.01,.02,... .89,.99都應該被製作出來,而不僅僅是整個四分之一。 – 2011-05-13 16:59:02

1

如果你希望結果'舍入'到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 
+0

正如我的示例所指出的,它的整數除以小數點後會產生小數點後最多2位小數的答案。你的樣品用整數除法顯示它是不正確的。 – Joe 2011-05-14 05:13:02

+2

@Joe:你說'例如'這意味着,這是實現它的可能方法之一,而不是唯一的方法。必須更清楚。 – Claudiu 2011-05-14 14:04:58

4
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) 
0

對我來說,被除數和除數均爲隨機數。我必須得出一個答案,它不需要舍入小數點後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億次嘗試找到該除數的解決方案。

0

使用setRoundingMode設置舍入模式,然後使用所需輸出的格式模式。

檢查post ....