2017-09-21 53 views
0

我想要執行一個實驗,在這個實驗中我必須爲參與者提供三種可能性(Positive Neutral和Negative:這些基本上都是可以加載到html頁面中的類)並且是隨機的,如下所示隨機顯示,平均分配

function EqualDistribute(id) { 
    var a; 
    var random = Math.floor((Math.random() * 10) + 1); //number between 1 and 10 

    if (random <= 3) { 
     a = '2'; 
     //load a neutral class 
    } 
    if (random > 3 && random <= 6) { 
     a = '3'; 
     //load a positive class 
    } 
    if (random > 6) { 
     a = '4'; 
     //load a negative class 
    } 
    return false; 
} 

的「A」與裝載每一類的值發生變化 - 反正,現在我想要做的是 - 隨機化類(基於mathrandom或其他方式的即時通訊已經在做的樣子,只是這樣的這些類的外觀是隨機的)和.. - 類的均等分佈(意味着在實驗結束時,所有的主體都能看到/體驗到相同的數字o f類加載,即在我的情況下, 30正30負和30中性)

我現在正在做的是簡單地隨機顯示類,而不保持每個30的平衡。

請原諒我的編程技巧 並感謝您的幫助,因爲我堅持這裏!

回答

0

在你的代碼中,你的繪圖是放回去的。但是你必須從泳池中抽出,不要退縮。

所以你的游泳池是所有的類(30負,30中立和30正)。選擇一個後,此類型應該少一個(不放回)。

var pool = []; 
var count_per_class = 30; 
var number_of_classes = 3; 

// fill pool 
for (var number = 0; number < number_of_classes; number++) 
{ 
    for (var count = 0; count < count_per_class; count++) 
    { 
     pool.push(number); 
    } 
} 

// returns a random class ID between 0 and number_of_classes - 1 
function getNextClassId() { 

    // get random index 
    var randomIndex = Math.floor((Math.random() * pool.length)); 
    var class_number = pool[randomIndex]; 

    // remove item at index 
    var start = pool.slice(0, randomIndex); 
    var end = pool.slice(randomIndex + 1, pool.length); 
    pool = start.concat(end); 

    return class_number; 
} 

// test if it works 
var testArray = []; 
for (var i = 0; i < number_of_classes; i++) { 
    testArray[i] = 0; 
} 

// take out while classes remain in pool 
while (pool.length > 0) { 

    // Do something here with this ID, e.g. count occurrences for every class 
    // should be count_per_class at the end for each index. 
    testArray[getNextClassId()]++; 

} 

// prints [30, 30, 30] 
console.log(testArray); 
+0

謝謝,請給我看看javascript代碼,再次感謝 –

+0

嗨,感謝您的回覆 - 請看看我在使用fischer shuffle算法,並試圖找到陣列中的第一個元素,然後執行倒計時 - 即時能夠加載CSS類的外觀,但不能做arr.shift(),甚至計數器不工作** bold ** [link] https://jsfiddle.net/x4urk8qp/ –

+0

'arr.shift()'之前的if條件'從來都不是真的,因爲你重新初始化變量m/n/l。並嘗試添加一個按鈕,該按鈕再次調用MyFunction,並添加'。 – LeBlue

0

你可以做的是檢查類== 30,然後從隨機分佈中排除你的類。所以只有最後兩個班是「參與」的。等等。

0

如果你想測試的重裝,你會probaly必須使用localStorage

看看這個CodePen Demo並嘗試刷新頁面。

+0

嗨,非常感謝 - 不過,在你的解決方案中,即使達到了30,它仍然會加載類 - 在我的情況下,它是一個CSS類,它不應該顯示在頁面上,或者實際上已經加載了30次,因此函數應該從3個CSS類中排除它,並且應該在其餘兩個之間運行,直到其中一個之後達到30,然後最後一個繼續加載並且向參與者展示,以便CSS類只加載30次 - 我希望我的意思是說明性的!! –

+0

你可以做一些像[this](https://codepen.io/dankreiger5/pen/QqGEXL) –

+0

非常感謝 - 你的建議幫助我想出了很多自己的解決方案:) –