2013-12-08 95 views
1

我將如何去將浮點數分成10個隨機浮點數組。所以得到的數組項將加起來到原始的浮點數。拆分浮動成10個隨機浮點數

我正在努力思考如何解決這個問題。

任何意見,我會怎麼做?

[編輯]:另外,沒有一個項目應該等於原始浮點數的1%。

[EDIT2]:讓我再澄清一點。

var num = 1 

var array = ['0.05', '0.4', '0.1', '0.05', '0.03', '0.02', '0.01', '0.09', '0.05', '0.2']; 

現在所有數組項都等於num並且不小於num的1%。我將如何從num填充這個數組?

+0

你能計算之前的10個花車嗎?還是你需要把你的號碼分成隨機的花車? – worenga

+6

生成10個隨機數。把它們加起來,然後找出每個代表的總數的百分比。將這些百分比乘以原始數字。然後處理補償二進制浮點錯誤的噩夢。 – Pointy

+1

這是什麼意思? –

回答

2

以下幾種方法:

產生10個浮點數,檢查是否所有的人都>比他們的總和的1%,再生如果需要的話,我想這個可以自己很容易被編碼

另一種方法是在@mightyuhu答案開始,但也有可能是無限循環,這裏是版本,這是對循環更穩定:

var v = 10; // your number 
 
    var array = new Array(); // final array 
 

 
    var v2 = v; 
 
    var v1p = v/100.0; 
 
    while (array.length < 9) { // generate 9 numbers 
 
     var r = 0; 
 
     while ((r <= v1p) || (r >= v2)) 
 
      r = Math.random() * v2/(10 - array.length); 
 

 
     array.push(r); 
 
     v2 -= r; 
 
    } 
 
    array.push(v2); // this is 10th number 
 

 
    // just for test: 
 
    document.write("original: " + v + "<br>"); 
 
    var sum = 0.0; 
 
    for (var v2 in array) { 
 
     document.write("array[" + v2 + "]: " + array[v2] + "<br>"); 
 
     sum += array[v2]; 
 
    } 
 
    document.write("sum: " + sum + "<br>");

+1

你的實現確實更好。但是,我意識到,這種類型的算法的問題在於,隨着值不斷下降,值分佈並不是真正隨機的。 (1%的約束對隨機性也有很大的影響) – worenga

+0

@ mightyuhu是的,你說得對,我希望它不會用在加密中:) –

0
var floatNumber = 2; 

var dividedSum=0; 

var newFloatNumber=floatNumber; 

var numberHolder = new Array(); 

for(var i=0; i<9;i++) 
{ 

var random = (Math.random()*newFloatNumber)+(floatNumber/100); 

newFloatNumber = newFloatNumber - random; 

dividedSum = dividedSum + random; 

numberHolder[i] = random; 

document.getElementById('output').innerHTML += numberHolder[i]+" "; 

} 

這應該工作我猜

0
function divideIntoSections(number,minimum,size){ 
    "use strict"; 
    var array = []; 
    var runningTotal = 0; 
    var counter = size; 
    for (var i = 0; i < size; i++) { 
     counter -= 1; 
     var maximum = number - runningTotal - counter; 
     var randomNumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum; 
     runningTotal += randomNumber; 
     if (counter === 0 && runningTotal != number){ 
      randomNumber = randomNumber + (number - runningTotal); 
     } 
     array.push(randomNumber); 
    } 
    return array; 
} 
divideIntoSections(100,100*0.01,10); 

這裏是一個函數,希望能有所幫助。