使用C#中Random函数获取随机值的时候出现的问题(100分)

wfyloo1981 2009-11-26 10:10:51
问题现象:程序如果直接运行得出的结果就是固定顺序的值;如果在其中其中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);
}
}
...全文
557 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
angieduan 2009-11-26
  • 打赏
  • 举报
回复
Random sourceGen = new Random(new Guid().GetHashCode());
wartim 2009-11-26
  • 打赏
  • 举报
回复
看错了,按你这段,和种子数没关系,应该是随机的,只要不是连续new而没有sleep:sourceGen = new Random();
wartim 2009-11-26
  • 打赏
  • 举报
回复
        // 摘要:
// 使用与时间相关的默认种子值,初始化 System.Random 类的新实例。
public Random();

Thread.Sleep
rqx110 2009-11-26
  • 打赏
  • 举报
回复
http://blog.miniasp.com/post/2008/05/Random-vs-RNGCryptoServiceProvider.aspx
建议LZ看下这篇文章,random其实有时候真的不够随机。
liherun 2009-11-26
  • 打赏
  • 举报
回复
hasFoundIndexs[i] = index;

或者
index = random.Next(52);

加上
Thread.Sleep(10);
试试
liherun 2009-11-26
  • 打赏
  • 举报
回复
随即数是根据时间得出来的,程序执行很快的,你的2次执行的时间差很小,所以随机数是一样的
sleep(10)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧