混洗数据的算法

Algorithm to shuffle data

我有如下数据 table(字符串[][]):

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 类)随机排列数据。假设 table 中有 100 条记录,因此对于“0”中的 50 条和“1”中的 50 条,随机播放应该 return [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.

我的第一个(未经测试的)想法是:

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的概率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,因此如果发生这种情况,您可以只调整最后一个元素)。