C# ---- 算法之洗牌算法

作为一名学数学的渣渣,其实对各种算法还是有兴趣的。有时候看到某位大神写的精妙的算法真真是比一场演唱会都精彩~~

洗牌算法常用于像是连连看,爱消除这种小游戏。目的就在于打乱既定顺序。

我目前喜欢并觉得效率高易理解的洗牌算法有两种实现方式。下面一一陈述。

本博在csdn看到某位大神写的,随手摘抄了。

第一种是用取余的方法随机取值

 private void random1(int[] array,int length)
          {
               int index;
               int value;
               int wangsai;

               if (array == null || length == 0)
               {
                    return;
               }

               for (index = 0; index < length; index++)
               {
                    // 随机数是为了取余
                    value = index + new Random().Next(0,10000000)%(length - index);

                    median = array[index];
                    array[index] = array[value];
                    array[value] = wangsai;
               }
          }

第二种方法是取随机索引值

   private void random2(int[] array,int length)
          {
               int index;
               int value;
               for (int i = length - 1; i > 0; i--)
               {
                    index = new Random().Next(0,i+1);

                    value = array[i];
                    array[i] = array[index];
                    array[index] = value;
               }
          }

具体实现方案:

public static void Main (string[] args)
          {
               int[] numbers = new int[54];
               int length = numbers.Length;
               for (int i = 0; i < length; i++)
               {
                    numbers[i] = i + 1;
               }
               MainClass m = new MainClass ();
               m.random1 (numbers, length);
               foreach (int i in numbers)
               {
                    Console.Write(i + " ");
               }
               Console.WriteLine ("**********************");

               m.random2 (numbers, length);
               foreach (int i in numbers)
               {
                    Console.Write(i + " ");
               }

困困困饿饿饿。。。不码字了!!

时间: 2024-10-10 07:17:06

C# ---- 算法之洗牌算法的相关文章

算法之洗牌算法

洗牌算法是我们常见的随机问题,在玩游戏.随机排序时经常会碰到,一个最常用的地方就是组卷.它可以抽象成这样:M以内的所有自然数的随机顺序数组. package com.math; import java.util.Random; /** * @author summer * */ public class Shuffle { static final int[] a = new int[54]; static Random rnd = new Random(); static{ for(int i

【每日算法】洗牌算法

洗牌算法 给定一个n个数的序列,设计一个算法将其随机打乱,保证每个数出现在任意一个位置的概率相同(也就是说在n!个的排列中,每一个排列出现的概率相同). 朴素的做法: 假设输入为数组num[length]. 随机选一个数,放到num[0]中,再随机选数,如果该数已经选过,重新选,直到该数未选过时放入num[1]中,以此类推,直到所有的数都选出来,很明显,这种选法一共有n!中可能,每种可能出现的概率都相同. 但是该做法效率不高,因为选过的数再选将耗费大量时间. 改进的洗牌算法: 基于以上算法的缺陷

一步一步写算法(洗牌算法)

[ 声明:版权所有所有,欢迎转载.不用于商业用途. 联系我们:feixiaoxing @163.com] 扑克洗牌是我们的生命更喜欢玩游戏. 么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c执行库其中有一个随机函数rand,它能够生成0~32767之间的随意数.那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢? 在这里我抛砖引玉一下,谈一谈自己眼下已经看到的两个算法.欢迎朋友们谈一谈其它的方法. (1)全局洗牌法 过程例如以下所看到的: a)首先生成一个数组,大小为54,初始化为

完美洗牌算法

本文是看完july博客完美洗牌之后的个人笔记. 题目:把a1,a2,a3,a4,...,an-1 an,b1,b2,b3,...,bn-1,bn变成a1,b1,a2,b1,...,an,bn.要求时间复杂度为O(n),空间复杂度为O(1). 1.位置置换算法:b是新开的一个数组,但是时间复杂度为O(n),空间复杂度为O(n). void perfectShuttle(int a[],int n){ int n2=n*2,b[N]; for(int i=1;i<=n2;i++) b[(2*i)%(

洗牌算法Fisher-Yates以及C语言随机数的产生

前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yates.现在大家在网上看到,大多是Fisher-Yates算法的变形.将本来O(n2),简化到了O(n).代码如下: #include<stdio.h> #include <stdlib.h> void func(char *, int); void main() { char a[7]

洗牌算法(转载)

作者:flyinghearts出处:http://www.cnblogs.com/flyinghearts/ 又一次看到讨论"洗牌"算法的文章,奇怪不少人喜欢造轮子,但造的轮子却远没有STL的random_shuffle好用. 若某个序列里面的每个元素在每个位置已经等概率出现,那么新增加一个元素,只要新增加的元素和所有元素进行等概率交换,则新序列中每个元素在每个位置仍是等概率出现.(若原来有n个元素,新增加的第n+1个元素在任一位置b的概率显然是1/(n+1),在同一位置b,原来的n个

JS洗牌算法

洗牌算法 以请将1~10共10个数字的数组随机打乱为列子,目前我知道的有两种方法,一种sort()方法和push()方法. 一.sort方法: var arr=[1,2,3,4,5,6,7,8,9]; function Upset(a,b) { //用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1   return Math.random()>.5 ? -1 : 1;  //简化上面的方法 // return 0.5 - Math.random();  } arr

洗牌算法浅试

Python有自带的洗牌算法函数shuffle(). 自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(1)的例子: 1 import random 2 3 def shuffle1(lst) : 4 l = len(lst) 5 if l <= 1 : return lst 6 7 i = 0 8 while l > 1 : 9 j = int(random.random() * l) 10 t = lst[i] 11 lst[i] = lst[i+j] 12

转:浅谈洗牌算法(面试题)

很多人都有耳闻过洗牌算法,时常会在面试中碰到,我们下面来定义一下这个问题. 所谓洗牌算法,就是给你一个1到n的序列,让你随机打乱,保证每个数出现在任意一个位置的概率相同,也就是说在n!个的排列中,每一个排列出现的概率相同. 最朴素的做法 对于这个问题我们从最朴素的解法谈起.每次随机选出一个没有被选过的数放到一个队列中,如果随机出来的数已经被选过,那么继续随机直到遇到一个没有被选过的数放入到队列中:重复这样子操作直到所有的数都被选择出来. 我们看看这样子作为什么是对的.首先选第一个数的时候有n个数