2017-04-09 71 views
1

我有數據表(串[] [])象下面這樣:算法洗牌數據

0, b, b, b 
0, b, a, c 
0, b, c, b 
0, c, b, a 
1, b, b, c 
1, b, a, b 
0, a, b, c 
0, a, b, b 
... 

我需要通過第一列(始終爲2類)洗牌的數據。假設表中有100條記錄,所以對於'0'中的50個和'1'中的50個,shuffle應該返回[0,1,0,1,0,1 ...]。 (< - 這是第一列結果,但它應該移動所有記錄;將其他列與第一列混洗)
對於'0'中的33個和'1'中的67個,第一列應爲[0,1,1, 0,1,1,0 ...]。
有可能像21-79,44-56等不同的分裂也可能有超過100個記錄,例如。 812,1123 ...
有沒有任何算法來處理這個問題? 我想要在C#中編程,但也可以在Excel中完成。

回答

1

先算者的數量和行數除以它,所以你知道的概率p獲得1.

int count = 0; 
for (int i = 0; i < arr.length; i++) 
    if ("1".equals(arr[i][0])) 
     count++; 
double p = ((double)count)/arr.length; 
int[] goal = new int[arr.length]; 
double t = 0; 
for (int i = 0; i < goal.length; i++) { 
    t += p; 
    if (t >= 1) { 
     t--; 
     goal[i] = 1; 
    } else { 
     goal[i] = 0; 
    } 
} 

現在您可以根據目標數組來洗牌行。警告由於四捨五入錯誤,目標變量中的那些計數可能是錯誤的(不應該超過1個差異,所以如果發生這種情況,您可以調整最後一個元素)。

1

我的第一個(未經測試)的想法是:

for i = 0 to 99: 
    if 67*i/100 <> 67*(i+1)/100: 
     print("1") 
    else: 
     print("0") 

而實際上它的工作原理:https://play.golang.org/p/gxbZ6np6JZ

+0

它工作正常,但我不夠精確,所以我對我的問題做了一些改變。 – user3785803

+0

由於舍入誤差,這更好。 – maraca