您的位置:首页 > 其它

概率分析与随机算法

2011-03-16 13:53 162 查看
1. 数组的随机排列算法及其简单验证

2.随机算法简单分析

3. 代码下载

1. 数组的随机排列算法及其简单验证

1.1 数组的排列的随机算法的最终目的是达到,数组每个元素在每个位置上出现的概率为1/n(其中n为数组大小)。一种的算法如下,对于数组A中的每个元素A[i],随机附上一个权值,然后根据该权值对A数组进行排序。下面是一个简单的实现,排序使用的是冒泡排序,代码如下:

public static void PermuteBySorting(ref int[] A)
{
int length = A.Length;
List<int> B =
new List<int>();
// 随机数
System.Random rand = new System.Random();

foreach (int item in A)
{
// [1, length^3]
B.Add(rand.Next(1, (int)Math.Pow(length, 3)));
}

// 根据key排序,这里使用冒泡排序
int tmp;
for (int i = 0; i < B.Count; ++i)
for (int j = B.Count - 1; j >= (i + 1); --j)
{
// 递增,交换数据
if(B[i] > B[j])
{
// 没有必要记录A中的数据,交换A中的数据
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
}

1.2 另外一种数组随机算法如下:遍历数组,随机选择数组的另外的一个元素,交换这两个元素的位置。算法比较简单,实现代码如下:

// 就地排序
public static void RandomizeInPlace(ref int[] A)
{
int length = A.Length;

System.Random rand = new System.Random();
int num, tmp;

for (int i = 0; i < length; ++i )
{
num = rand.Next(0, (length - 1));
tmp = A[i];
A[i] = A[num];
A[num] = tmp;
}

// 输出结果
foreach(int item in A)
{
Console.WriteLine(item);
}
}

2. 随机算法分析

随机算法中一种比较重要的分析方法是使用指示器分析法。定义变量如下:

定义样本空间S

事件A

随机变量指示器I

I(A)定义如下:



一个简单的使用随机指示器变量的例子:我们都知道如果硬币是均匀的话,投掷硬币n次出现正面的可能次数是n/2,也就是说正面的出现次数和反面出现的次数在大量的统计上是相同的,下面我们从数学的方法去证明这个事实。

定义随机变量X表示n次掷硬币出现的正面的次数,该事件能够分解成如下的Xi,表示第i次投掷硬币出现正面向上的事件。于是



两边取期望值:



即证明n次投掷硬币的工程中,可能出现正面朝上的次数是n/2。通过上面的例子的分析可以看出最主要的是定义事件X,然后将事件X分解成较小子事件Xi,最后求得X的期望值。利用上面的方法同样呢能够证明“生日悖论”等问题。

3.代码下载

/Files/xuqiang/Random.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: