我有数据表(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中进行编程。
答案 0 :(得分:1)
我的第一个(未经测试的)想法是:
for i = 0 to 99:
if 67*i/100 <> 67*(i+1)/100:
print("1")
else:
print("0")
答案 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个差异,所以如果发生这种情况,你可以调整最后一个元素)。