using System;
class TestCard
{
static void Main(string[]args)
{
int i,j,temp;
Random Rnd=new Random();
int k;
int[]Card=new int[52];
int[,] Player=new int[4,13];
for(i=0;i<4;i++) //52张牌初始化
for(j=0;j<13;j++)
Card[i*13+j]=(i+1)*100+j+1;
Console.Write("How many times for card:");
string s=Console.ReadLine();
int times=Convert.ToInt32(s);
for(j=1;j<times;j++)
for(i=0;i<52;i++)
{
k=Rnd.Next(51-i+1)+i; //产生i到52 之间的随机数
temp=Card[i];
Card[i] = Card[k];
Card[k]=temp;
}
k=0;
for(j=0;j<13;j++) //52张牌分发给四个玩家
for(i=0;i<4;i++)
Player[i,j]=Card[k++];
for(i=0;i<4;i++) //显示4个玩家的牌
{
Console.WriteLine("玩家{0}的牌:",i+1);
for(j=0;j<13;j++)
{
k=(int)Player[i,j]/100; //分离出牌的种类
switch(k)
{
case 1: //红桃
s=Convert.ToString('\x0003');
break;
case 2: //方块
s=Convert.ToString('\x0004');
break;
case 3: //梅花
s=Convert.ToString('\x0005');
break;
case 4: //黑桃
s=Convert.ToString('\x0006');
break;
} k=Player[i,j]%100; //分离出牌号
switch(k)
{
case 1:
s=s+"A";
break;
case 11:
s=s+"J";
break;
case 12:
s=s+"Q";
break;
case 13:
s=s+"K";
break;
default:
s=s+Convert.ToString(k);
break;
}
Console.Write(s);
if(j<12)
Console.Write(",");
else
Console.WriteLine(" ");
}
}
Console.Read();
}
}
class TestCard
{
static void Main(string[]args)
{
int i,j,temp;
Random Rnd=new Random();
int k;
int[]Card=new int[52];
int[,] Player=new int[4,13];
for(i=0;i<4;i++) //52张牌初始化
for(j=0;j<13;j++)
Card[i*13+j]=(i+1)*100+j+1;
Console.Write("How many times for card:");
string s=Console.ReadLine();
int times=Convert.ToInt32(s);
for(j=1;j<times;j++)
for(i=0;i<52;i++)
{
k=Rnd.Next(51-i+1)+i; //产生i到52 之间的随机数
temp=Card[i];
Card[i] = Card[k];
Card[k]=temp;
}
k=0;
for(j=0;j<13;j++) //52张牌分发给四个玩家
for(i=0;i<4;i++)
Player[i,j]=Card[k++];
for(i=0;i<4;i++) //显示4个玩家的牌
{
Console.WriteLine("玩家{0}的牌:",i+1);
for(j=0;j<13;j++)
{
k=(int)Player[i,j]/100; //分离出牌的种类
switch(k)
{
case 1: //红桃
s=Convert.ToString('\x0003');
break;
case 2: //方块
s=Convert.ToString('\x0004');
break;
case 3: //梅花
s=Convert.ToString('\x0005');
break;
case 4: //黑桃
s=Convert.ToString('\x0006');
break;
} k=Player[i,j]%100; //分离出牌号
switch(k)
{
case 1:
s=s+"A";
break;
case 11:
s=s+"J";
break;
case 12:
s=s+"Q";
break;
case 13:
s=s+"K";
break;
default:
s=s+Convert.ToString(k);
break;
}
Console.Write(s);
if(j<12)
Console.Write(",");
else
Console.WriteLine(" ");
}
}
Console.Read();
}
}
Random rnd = new Random();
int[] card = new int[52];
int[,]player=new int [4,13];
for (i = 0; i < 4; i++)
{
for (j = 0; j < 13; j++)
{
card[13 * i + j] = (i + 1) * 100 + j + 1;
}
} Console.Write("洗多少次: ");
string str = Console.ReadLine();
int times = Convert.ToInt32(str); for (int a = 0; a < times; a++)
{
for (int b = 0; b < 52; b++)
{
k = rnd.Next(52 - b) + b;
temp = card[b];
card[b] = card[k];
card[k] = temp;
}
}
k=0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 13; j++)
{
player[i, j] = card[k++];
}
}
for (i = 0; i < 4; i++)
{
Console.WriteLine("玩家{0}", i + 1);
for (j = 0; j < 13; j++)
{
k = Convert.ToInt32(player[i, j] / 100);
switch (k)
{
case 1:
str = Convert.ToString('\x0003');
break;
case 2:
str = Convert.ToString('\x0004');
break;
case 3:
str = Convert.ToString('\x0005');
break;
case 4:
str = Convert.ToString('\x0006');
break;
} k = player[i, j] % 100;
switch (k)
{
case 1:
str = str + "A";
break;
case 11:
str = str + "J";
break;
case 12:
str = str + "Q";
break;
case 13:
str = str + "K";
break;
default:
str = str + Convert.ToString(k);
break;
}
Console.Write(str);
if (j < 12)
{
Console.Write(",");
}
else
{
Console.Write(""+"\n");
}
}
}
Console.Read();你的哪里有问题呀???
using System;
using System.Diagnostics;
namespace Lucifer.CSharp.Sample
{
class Program
{
static void Main(string[] args)
{
//初始化牌局
int[] array = new int[52];
for (int i = 0; i < array.Length; i++)
{
array[i] = i;
}
//洗牌
Permute<int>(array);
//验证牌局
for (int i = 0; i < array.Length; i++)
{
var value = array[i];
for (int j = 0; j < array.Length; j++)
{
if (j == i) continue;
Debug.Assert(array[j] != value);
}
}
}
static void Permute<T>(T[] array)
{
Random random = new Random();
for (int i = 1; i < array.Length; i++)
{
Swap<T>(array, i, random.Next(0, i));
}
}
static void Swap<T>(T[] array, int indexA, int indexB)
{
T temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;
}
}
}
using System;
using System.Diagnostics;namespace Lucifer.CSharp.Sample
{
class Program
{
static void Main(string[] args)
{
//初始化牌局
int[] array = new int[52];
for (int i = 0; i < array.Length; i++)
{
array[i] = i;
} //洗牌
Permute<int>(array); //验证牌局
for (int i = 0; i < array.Length; i++)
{
var value = array[i];
for (int j = 0; j < array.Length; j++)
{
if (j == i) continue;
Debug.Assert(array[j] != value);
}
}
} static void Permute<T>(T[] array)
{
Random random = new Random();
for (int i = 1; i < array.Length; i++)
{
Swap<T>(array, i, random.Next(0, i));
}
} static void Swap<T>(T[] array, int indexA, int indexB)
{
T temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;
}
}
} 代码示例中的 Permute<T>(T[] array) 方法产生一个随机序列。第一个循环用 1, 2, 3, …, N 初始化该序列。第二个循环完成一次随机洗牌。在该循环的每次迭代中,我们讲 array[j] 的值于数组位置在区间[0, j)之间的某个元素相交换(也可能不交换)。然而,我们要问的是 Permute<T>(T[] array) 方法产生的所有排列等概率吗?若根据该算法,答案为是。因为一共有 N! 种可能的排列,而 Swap<T>(array, i, random.Next(0, i)); 这一句 N-1 次调用 Next 方法出现的不同结果也是 N! 种。但是,事实上答案为否,并非所有排列都是等概率。问题就出在可爱的伪随机数数生成器(Pseudo-Random Number Generator)上。PRNG 的随机性很大程度上限制了随机序列的随机性。所以,上述代码需要一个更好的伪随机数数生成器以使实际与理论更加相符。但是好的 PRNG 往往伴随着性能的下降,比如 Mt19937 随机化算法。题外话:实际代码运行中,发现上述代码能很好的完成洗牌算法要求,但不保证其能在商业化项目中得以正确实践。 如果有兴趣的朋友可以留言一下,我们可以讨论一下!