问题现象:程序如果直接运行得出的结果就是固定顺序的值;如果在其中其中Main中GetRandomCards方法的建立Random对象处加上断点的话,得出的内容就是随机的了。代码功能:从搅乱的一副牌中取出5张牌,如果5张牌都是相同花色,在屏幕上显示5张牌和"Flush"字样;否则在屏幕上显示5张牌和"No Flush"字样。
代码来源:《C#入门经典》第十章练习4
代码如下:
Main class Program
{
static void Main(string[] args)
{
Deck myDeck = new Deck();
myDeck.Shuffle();
Card[] fiveCards = GetRandomCards(myDeck, 5);
bool diffentSuit = false;
for (int i = 1; i < fiveCards.Length; i++)
{
if (fiveCards[i - 1].suit != fiveCards[i].suit)
{
diffentSuit = true;
break;
}
} for (int i = 0; i < fiveCards.Length; i++)
Console.WriteLine("No.{0} card is {1}", i + 1, fiveCards[i].ToString()); if (diffentSuit == true)
Console.WriteLine("No Flush!");
else
Console.WriteLine("Flush!");
Console.ReadKey();
} static Card[] GetRandomCards(Deck myDeck, int count)
{
Card[] cards = new Card[count];
Random random = new Random();
int[] hasFoundIndexs = new int[count];
for (int i = 0; i < count; i++)
{
int index = -1;
bool hasFound = false;
do
{
hasFound = false;
index = random.Next(52);
for (int j = 0; j < i; j++)
{
if (hasFoundIndexs[j] == index)
{
hasFound = true;
break;
}
}
}
while (hasFound == true); cards[i] = myDeck.GetCard(index);
hasFoundIndexs[i] = index;
}
return cards;
}
}Card类:一张扑克牌 public class Card
{
public readonly Rank rank;
public readonly Suit suit; private Card()
{
} public Card(Suit newSuit, Rank newRank)
{
rank = newRank;
suit = newSuit;
} public override string ToString()
{
return "The " + rank + " of " + suit + "s";
}
}Deck类:一副扑克牌 public class Deck
{
private Card[] cards;
public Deck()
{
cards = new Card[52];
for (int suitVal = 0; suitVal < 4; suitVal++)
{
for (int rankVal = 1; rankVal < 14; rankVal++)
{
cards[suitVal * 13 + rankVal - 1] = new Card((Suit)suitVal, (Rank)rankVal);
}
} } public Card GetCard(int cardNum)
{
if (cardNum >= 0 && cardNum <= 51)
return cards[cardNum];
else
throw (new System.ArgumentOutOfRangeException("cardNum", cardNum, "Values must be between 0 and 51."));
} public void Shuffle()
{
Card[] newDeck = new Card[52];
bool[] assigned = new bool[52];
Random sourceGen = new Random();
for (int i = 0; i < 52; i++)
{
int deskCard = 0;
bool foundCard = false;
while (foundCard == false)
{
deskCard = sourceGen.Next(52);
if (assigned[deskCard] == false)
foundCard = true;
}
assigned[deskCard] = true;
newDeck[deskCard] = cards[i];
}
newDeck.CopyTo(cards, 0);
}
}
代码来源:《C#入门经典》第十章练习4
代码如下:
Main class Program
{
static void Main(string[] args)
{
Deck myDeck = new Deck();
myDeck.Shuffle();
Card[] fiveCards = GetRandomCards(myDeck, 5);
bool diffentSuit = false;
for (int i = 1; i < fiveCards.Length; i++)
{
if (fiveCards[i - 1].suit != fiveCards[i].suit)
{
diffentSuit = true;
break;
}
} for (int i = 0; i < fiveCards.Length; i++)
Console.WriteLine("No.{0} card is {1}", i + 1, fiveCards[i].ToString()); if (diffentSuit == true)
Console.WriteLine("No Flush!");
else
Console.WriteLine("Flush!");
Console.ReadKey();
} static Card[] GetRandomCards(Deck myDeck, int count)
{
Card[] cards = new Card[count];
Random random = new Random();
int[] hasFoundIndexs = new int[count];
for (int i = 0; i < count; i++)
{
int index = -1;
bool hasFound = false;
do
{
hasFound = false;
index = random.Next(52);
for (int j = 0; j < i; j++)
{
if (hasFoundIndexs[j] == index)
{
hasFound = true;
break;
}
}
}
while (hasFound == true); cards[i] = myDeck.GetCard(index);
hasFoundIndexs[i] = index;
}
return cards;
}
}Card类:一张扑克牌 public class Card
{
public readonly Rank rank;
public readonly Suit suit; private Card()
{
} public Card(Suit newSuit, Rank newRank)
{
rank = newRank;
suit = newSuit;
} public override string ToString()
{
return "The " + rank + " of " + suit + "s";
}
}Deck类:一副扑克牌 public class Deck
{
private Card[] cards;
public Deck()
{
cards = new Card[52];
for (int suitVal = 0; suitVal < 4; suitVal++)
{
for (int rankVal = 1; rankVal < 14; rankVal++)
{
cards[suitVal * 13 + rankVal - 1] = new Card((Suit)suitVal, (Rank)rankVal);
}
} } public Card GetCard(int cardNum)
{
if (cardNum >= 0 && cardNum <= 51)
return cards[cardNum];
else
throw (new System.ArgumentOutOfRangeException("cardNum", cardNum, "Values must be between 0 and 51."));
} public void Shuffle()
{
Card[] newDeck = new Card[52];
bool[] assigned = new bool[52];
Random sourceGen = new Random();
for (int i = 0; i < 52; i++)
{
int deskCard = 0;
bool foundCard = false;
while (foundCard == false)
{
deskCard = sourceGen.Next(52);
if (assigned[deskCard] == false)
foundCard = true;
}
assigned[deskCard] = true;
newDeck[deskCard] = cards[i];
}
newDeck.CopyTo(cards, 0);
}
}
sleep(10)
后
或者index = random.Next(52);
前
加上Thread.Sleep(10); 试试
建议LZ看下这篇文章,random其实有时候真的不够随机。
// 使用与时间相关的默认种子值,初始化 System.Random 类的新实例。
public Random();
Thread.Sleep