- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在微软面试中被问到了。非常想知道为什么这些人会问这么奇怪的概率问题?
给定一个 rand(N),一个随机生成器,它生成从 0 到 N-1 的随机数。
int A[N]; // An array of size N
for(i = 0; i < N; i++)
{
int m = rand(N);
int n = rand(N);
swap(A[m],A[n]);
}
最佳答案
好吧,我对这个有点乐趣。当我第一次阅读这个问题时,我想到的第一件事是群论(特别是对称群 Sn)。 for 循环通过在每次迭代中组合转置(即交换)来简单地在 Sn 中构建置换 σ。我的数学不是那么出色,而且我有点生疏,所以如果我的符号不合适,请忍受我。
概述
让 A
是我们的数组在排列后不变的事件。我们最终被要求找到事件的概率 A
, Pr(A)
.
我的解决方案尝试遵循以下过程:
An identity transposition occurs when a number is swapped with itself. That is, when n == m in the above for loop.
N
换位。可以有
0, 1, 2, ... , N
出现在这个“链”中的身份转换。
N = 3
案例:
Given our input [0, 1, 2].
Swap (0 1) and get [1, 0, 2].
Swap (1 1) and get [1, 0, 2]. ** Here is an identity **
Swap (2 2) and get [1, 0, 2]. ** And another **
K_i
是事件
i
身份换位出现在给定的排列中。请注意,这形成了所有可能结果的详尽划分:
0
之间和 N
身份转换。 Now we can finally take advantage of the the partition. Note that when the number of non-identity transpositions is odd, there is no way the array can go unchanged*. Thus:
*From group theory, a permutation is even or odd but never both. Therefore an odd permutation cannot be the identity permutation (since the identity permutation is even).
So we now must determine two probabilities for N-i
even:
The first term, , represents the probability of obtaining a permutation with i
identity transpositions. This turns out to be binomial since for each iteration of the for loop:
1/N
.Thus for N
trials, the probability of obtaining i
identity transpositions is:
So if you've made it this far, we have reduced the problem to finding for N - i
even. This represents the probability of obtaining an identity permutation given i
of the transpositions are identities. I use a naive counting approach to determine the number of ways of achieving the identity permutation over the number of possible permutations.
First consider the permutations (n, m)
and (m, n)
equivalent. Then, let M
be the number of non-identity permutations possible. We will use this quantity frequently.
The goal here is to determine the number of ways a collections of transpositions can be combined to form the identity permutation. I will try to construct the general solution along side an example of N = 4
.
Let's consider the N = 4
case with all identity transpositions (i.e. i = N = 4
). Let X
represent an identity transposition. For each X
, there are N
possibilities (they are: n = m = 0, 1, 2, ... , N - 1
). Thus there are N^i = 4^4
possibilities for achieving the identity permutation. For completeness, we add the binomial coefficient, C(N, i)
, to consider ordering of the identity transpositions (here it just equals 1). I've tried to depict this below with the physical layout of elements above and the number of possibilities below:
I = _X_ _X_ _X_ _X_
N * N * N * N * C(4, 4) => N^N * C(N, N) possibilities
N = 4
和
i = 4
,我们可以看看一般情况。结合上面的分母,我们发现:
This is intuitive. In fact, any other value other than 1
should probably alarm you. Think about it: we are given the situation in which all N
transpositions are said to be identities. What's the probably that the array is unchanged in this situation? Clearly, 1
.
Now, again for N = 4
, let's consider 2 identity transpositions (i.e. i = N - 2 = 2
). As a convention, we will place the two identities at the end (and account for ordering later). We know now that we need to pick two transpositions which, when composed, will become the identity permutation. Let's place any element in the first location, call it t1
. As stated above, there are M
possibilities supposing t1
is not an identity (it can't be as we have already placed two).
I = _t1_ ___ _X_ _X_
M * ? * N * N
t1
的倒数。 ,实际上是
t1
(这是唯一的逆唯一性)。我们再次包含二项式系数:在这种情况下,我们有 4 个开放位置,我们希望放置 2 个身份排列。我们有多少种方法可以做到这一点? 4 选择 2。
I = _t1_ _t1_ _X_ _X_
M * 1 * N * N * C(4, 2) => C(N, N-2) * M * N^(N-2) possibilities
Finally we do the N = 4
case with no identity transpositions (i.e. i = N - 4 = 0
). Since there are a lot of possibilities, it starts to get tricky and we must be careful not to double count. We start similarly by placing a single element in the first spot and working out possible combinations. Take the easiest first: the same transposition 4 times.
I = _t1_ _t1_ _t1_ _t1_
M * 1 * 1 * 1 => M possibilities
t1
和
t2
.有
M
t1
的可能性并且只有
M-1
t2
的可能性(因为
t2
不能等于
t1
)。如果我们穷尽所有的安排,我们会留下以下模式:
I = _t1_ _t1_ _t2_ _t2_
M * 1 * M-1 * 1 => M * (M - 1) possibilities (1)st
= _t1_ _t2_ _t1_ _t2_
M * M-1 * 1 * 1 => M * (M - 1) possibilities (2)nd
= _t1_ _t2_ _t2_ _t1_
M * M-1 * 1 * 1 => M * (M - 1) possibilities (3)rd
t1
,
t2
,
t3
.让我们放置
t1
先然后
t2
.像往常一样,我们有:
I = _t1_ _t2_ ___ ___
M * ? * ? * ?
t2
s 可能还有,我们将在一分钟内看到原因。
t1
在第三个位置。通知,
t1
必须去那里,因为如果要去最后一个地方,我们只会重新创建
(3)rd
上面的安排。重复计算是不好的!这留下了第三个唯一元素
t3
到最终位置。
I = _t1_ _t2_ _t1_ _t3_
M * ? * 1 * ?
t2
的数量?更接近?换位
t1
和
t2
不能 是不相交的排列(即它们必须共享其
n
或
m
中的一个(并且只有一个,因为它们也不能相等)。这样做的原因是因为如果它们不相交,我们可以交换排列顺序。这意味着我们将重复计算
(1)st
安排。
t1 = (n, m)
.
t2
必须是形式
(n, x)
或
(y, m)
一些
x
和
y
为了不相交。请注意
x
可能不是
n
或
m
和
y
许多不是
n
或
m
.因此,可能的排列数
t2
可能实际上是
2 * (N - 2)
.
I = _t1_ _t2_ _t1_ _t3_
M * 2(N-2) * 1 * ?
t3
必须是
t1 t2 t1
的组合的倒数.让我们手动完成:
(n, m)(n, x)(n, m) = (m, x)
t3
必须是
(m, x)
.注意这是
不是 与
t1
不相交并且不等于
t1
或
t2
所以在这种情况下没有重复计算。
I = _t1_ _t2_ _t1_ _t3_
M * 2(N-2) * 1 * 1 => M * 2(N - 2) possibilities
N = 4
的答案。下面的情况。它与另一个答案中的经验数字非常匹配!
N = 4
停止工作.对于
N > 5
,给出的只是一个近似值(有多好,我不确定)。如果你仔细想想,很清楚为什么会这样:例如,给定
N = 8
换位,显然有四种方法可以用上面没有说明的四个独特元素来创建身份。随着排列变长(据我所知......),方式的数量似乎变得更加难以计算。
关于algorithm - 数组保持不变的概率是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11872190/
接下来是我的代码: with open("test.txt") as f_in: for line in f_in: for char in line:
我们有一个六面骰子,面编号为 1 到 6。随着 n 的增加,在第 n 卷中第一次看到 1 的概率降低。我想找到最小的卷数,使得这个概率小于某个给定的限制。 def probTest(limit):
我只是想知道为什么运行下面的代码时出现错误。我正在尝试使用 numpy 为基于文本的游戏计算概率。下面的代码不是游戏本身的代码。这仅用于测试目的和学习。感谢您提前的答复,请对我宽容一点。 from n
我目前正在创建一个与多个arduino板通信的服务器软件。由于硬件原因,我使用UDP协议(protocol)。我有一个非常简单的机制,在大多数情况下,当包裹丢失时,它会重新发送包裹。我现在有两个问题:
我想在 LinearLayout 上添加一个 fling Action 。为此,我使用了以下代码。 public class NewsActivity extends Activity { .
下面是其中一个 facebook 谜题:我无法理解如何进行此操作。 你有 C 个容器、B 个黑球和无限数量的白球。您希望以一种方式在容器之间分配球,即每个容器至少包含一个球,并且选择白球的概率大于或等
我有一个希伯来语文本,就像 "×گض¸×¨ض´×™×،ض°×کוض¹×ں",我想将它转换为可读的 unicode 希伯来语字符。 我试过这段代码: const string Str = "×گض¸×
我正在尝试使用 Random.nextDouble() 获取 1.0 和 10.0 之间的随机双数: double number = 1.0 + (10.0-1.0) * Random.nextDou
我目前已经为二进制类实现了概率(至少我这么认为)。现在我想扩展这种回归方法,并尝试将其用于波士顿数据集。不幸的是,我的算法似乎被卡住了,我当前运行的代码如下所示: from sklearn impor
我在 2D 空间中有一小组数据点(大约 10 个),每个数据点都有一个类别标签。我希望根据现有数据点标签对新数据点进行分类,并关联属于任何特定标签类别的“概率”。 基于最近邻的标签来标记新点是否合适(
我正在做我的第一个 tensorflow 项目。 我需要获得给定输入和预期序列的 ctc 概率(不是 ctc 损失)。 在 python 或 c++ 中是否有任何 api 或方法可以做到这一点? 我更
我正在尝试通过 assignment 1斯坦福 cs244n 类(class)。问题 1b 强烈建议对 Softmax 函数进行优化。我设法得到了N维向量的Softmax。我还得到了 MxN 维矩阵的
我有一个预测算法的想法,该算法可以根据所选项目先前出现的顺序准确预测随机值,并分析模式以提高准确性。 基本上是一种接受两个参数的算法,一个是一组可能的选择;另一个是这些数字的历史,分析该模式并预测序列
自 HOURS 以来,我一直在努力思考这个 TopCoder 问题,但无法找到一个完美的解决方案,并找到了下面给出的一个使用得非常漂亮的解决方案! 我想弄清楚这个解决方案如何适用于给定的问题?而我当初
我只知道如何生成随机 boolean 值(真/假)。默认概率为 50:50 但是我怎样才能用我自己的概率生成真假值呢?假设它以 40:60 或 20:80 等的概率返回 true... 最佳答案 一种
对于以下示例,我如何计算 julia 中的百分位数/概率值/尾部区域 Example : N(1100, 200) #Normally distributed with mean 1100 & st
我正在尝试修改标准 kNN 算法来获取属于某个类别的概率,而不仅仅是通常的分类。我还没有找到太多关于概率 kNN 的信息,但据我了解,它的工作原理与 kNN 类似,不同之处在于它计算给定半径内每个类的
我正在使用 PostgreSQL 为我所有数据中的变量对计算经验概率密度函数。我试图确定在计算 PDF 之前索引是否/何时更有效。我像这样运行 EXPLAIN CREATE INDEX, EXPLAI
有谁知道当查询有偏移时如何在 MySql 中请求“实时结果集”(例如:select * from table limit 10 offset 20;)。它正在经历类似 的错误 'invalid use
unsigned long long int first( int b , int c){ int h=b; //int k; for(int k=b-1;k>c;k--){ b=b*k;
我是一名优秀的程序员,十分优秀!