用于混洗数据的算法

时间:2017-04-09 19:55:05

标签: algorithm sorting shuffle

我有数据表(string [] []),如下所示:

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条记录,因此50条记录中有0条记录。和#30;' 1',shuffle应返回[0,1,0,1,0,1 ...]。 (< - 这是第一列结果,但它应该移动所有记录;将其他列与第一列一起洗牌)
对于' 0' ' 1'第一列应为[0,1,1,0,1,1,0 ......] 可能存在不同的分裂,如21-79,44-56等,也可能有超过100个记录,例如。 812,1123 ...
有没有算法来处理这个? 我希望在C#中编程,但我也可以在excel中进行编程。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

首先计算1的数量并将其除以行数,因此您知道获得1的概率p。

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个差异,所以如果发生这种情况,你可以调整最后一个元素)。

相关问题