我们还有一些玩家,每个玩家都会得到来自这个集合的不同随机数字。
现在,玩家们开始通过说:“我的数字在初始的1到10集合的一个子集中”来说出他或她的数字。例如,“我的数字是8、9或10”。
我们想要做出关于还没有说话的玩家数量的假设(当然,对于每个沉默的玩家,给出初始信息是相同的假设)。
假设我们有5个玩家,前3个玩家依次说:
1. 我的数字是8、9或10。 2. 我的数字是7或6。 3. 我的数字是7、6、9或10。
现在我们需要计算下一个玩家具有特定数字的可能性(概率),比如下一个玩家具有数字7的可能性是多少。
当然这只是一个例子,每个玩家可以用任何形式提供信息(例如“1或10”,“1到10”等)。
这是某种众所周知的问题吗?或者有人看到了一个好的方法吗? 我真的希望这个解决方案能够高效,所以暴力破解不是好的选择。我认为它可能直接与贝叶斯定理相关,但不能100%确定它可以应用于这里。
示例:
简单情况下有2个玩家和12345个数字。第一个玩家有4或5。 然后对于第二个玩家,他有25%的机会拥有1,但只有12.5%的机会拥有4,因为在第一个玩家说出他的手牌信息之后有2种可能的结果。
1234或1235,我们可以看到1是(1/4*2)/2=1/4,4是(1/4*1)/2= 1/8 这就是我所谓的暴力解决方案,通过分析每个组合来计算所有可能的组合并推导出数字概率。
更新:
Mr.Wizard提出的解决方案可行。
如果您想知道它的样子,这是代码:
class Program
{
static void Main()
{
int length = 5;
double[][] matrix = new double[length][];
for (int i = 0; i < length; i++) {
matrix[i] = new double[length];
}
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
matrix[i][j] = 1;
}
}
matrix[0] = new double[] { 0, 0, 0, 1, 1 };
matrix[1] = new double[] { 0, 0, 1, 1, 0 };
matrix[2] = new double[] { 0, 0, 0, 0, 1 };
DumpMatrix(matrix);
while(true)
{
NormalizeColumns(matrix);
DumpMatrix(matrix);
NormalizeRows(matrix);
DumpMatrix(matrix);
Console.ReadLine();
}
}
private static void NormalizeRows(double[][] matrix)
{
for (int i = 0; i < matrix.Length; i++)
{
double sum = matrix[i].Sum();
for (int j = 0; j < matrix.Length; j++) {
matrix[i][j] = matrix[i][j] / sum;
}
}
}
private static void NormalizeColumns(double[][] matrix)
{
for (int j = 0; j < matrix.Length; j++)
{
double columnSum = 0;
for (int i = 0; i < matrix.Length; i++)
{
columnSum += matrix[i][j];
}
for (int i = 0; i < matrix.Length; i++) {
matrix[i][j] = matrix[i][j] / columnSum;
}
}
}
private static void DumpMatrix(double[][] matrix)
{
for (int i = 0; i < matrix.Length; i++) {
for (int j = 0; j < matrix.Length; j++) {
Console.Write(matrix[i][j].ToString("0.#####").PadRight(8));
}
Console.WriteLine();
}
Console.WriteLine();
}
}
虽然从这个例子可以清楚地看出它并不是很快地接近最终结果。
在这里,玩家3有5点,玩家1和2可以分别有4或5
和3或4
,这意味着玩家1有4是因为玩家3得到了5,而玩家2有3是因为玩家2得到了4。但是,在许多迭代之后,我们在匹配列中为玩家1和2逼近1个值。