概率分析与随机算法
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;
}
}
}
{
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);
}
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.代码下载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?