c# – Random()为相同类型的新对象分配相同的值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Random()为相同类型的新对象分配相同的值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3599字,纯文字阅读大概需要6分钟。
内容图文
![c# – Random()为相同类型的新对象分配相同的值](/upload/InfoBanner/zyjiaocheng/811/a788540828b44637b77926cbdb04a4d1.jpg)
我为我不太明确的标题道歉,我发现很难深入描述这个问题.我试图用随机的SO研究类似的问题,并实施了这些建议,但没有成功.
我有以下代码模拟体育比赛.逻辑的核心在于Game类.当我模拟锦标赛时,分配给第一轮比赛中的球员的结果很好,就像按照预期随机分配一样.然而,当我模拟第二轮和第三轮等时,赢得第一轮的玩家获得与第一轮完全相同的分数.就好像系统记住它们,而不是生成新的随机值.我确定它与Random有关,但我无法绕过它.有没有人对我如何解决这个问题有任何建议?
RnDGen:
public class RndGen
{
private static Random random = new Random();
public static int Get(int min, int max)
{
return random.Next(min, max);
}
}
比赛:
public class Tournament : IAggregateRoot
{
public string Name { get; set; }
public int Year { get; set; }
public List<Round> Rounds { get; set; }
public GameMaster GameMaster { get; set; }
public Tournament(string name, int year)
{
Rounds = new List<Round>();
Name = name;
Year = year;
}
public void Simulate(List<Player> players)
{
var playersStillInTournament = players;
int roundNumber = 1;
while (playersStillInTournament.Count > 1)
{
var round = new Round(roundNumber);
round.Simulate(playersStillInTournament);
playersStillInTournament = round.Winners;
Rounds.Add(round);
roundNumber++;
}
}
}
回合:
public class Round
{
public int Number { get; private set; }
public List<Game> Games { get; set; }
public List<Player> Winners => Games.Select(g => g.Winner).ToList();
public Round(int number)
{
Number = number;
Games = new List<Game>();
}
public void Simulate(List<Player> players)
{
for(int i = 0; i != players.Count; i = i + 2)
{
var playersToAdd = players.Skip(i).Take(2).ToList();
var game = new Game(playersToAdd);
Games.Add(game);
}
}
}
游戏:
public class Game
{
public List<Player> Players { get; private set; }
private int MaxSets => (Players.First().Gender == Gender.Male) ? 5 : 3;
public Player Winner => Players.Find(p => p.SetPoints.Count(px => px == 6) == ((MaxSets + 2 - 1) / 2));
public Game(List<Player> players)
{
Players = players;
Simulate();
}
private void Simulate()
{
while (Winner == null)
{
var winnerId = Players[RndGen.Get(0, Players.Count)].Id;
var loserPoints = RndGen.Get(0, 5);
Players.Find(p => p.Id == winnerId).SetPoints.Add(6);
Players.Find(p => p.Id != winnerId).SetPoints.Add(loserPoints);
}
}
}
播放机
public class Player : Person
{
public List<int> SetPoints;
public int Points
{
get
{
return SetPoints.Sum();
}
}
public Player(string[] textFileLines, Gender gender)
: base(textFileLines, gender)
{
SetPoints = new List<int>();
}
人
public abstract class Person
{
public int Id { get; private set; }
public string FirstName { get; private set; }
public string MiddleName { get; private set; }
public string LastName { get; private set; }
public DateTime Birthday { get; private set; }
public string Country { get; private set; }
public string CountryCode { get; private set; }
public Gender Gender { get; set; }
// Returns the age as an integer
public int GetAge => DateTime.Now.Year - Birthday.Year;
protected Person(string[] textFileLines, Gender gender)
{
Id = Convert.ToInt32(textFileLines[0]);
FirstName = textFileLines[1];
MiddleName = textFileLines[2];
LastName = textFileLines[3];
Birthday = Convert.ToDateTime(textFileLines[4]);
Country = textFileLines[5];
CountryCode = textFileLines[6];
Gender = gender;
}
}
解决方法:
将模拟()更改为
private void Simulate()
{
while (Winner == null)
{
var winnerId = Players[RndGen.Get(0, Players.Count)].Id;
var loserPoints = RndGen.Get(0, 5);
Players.Find(p => p.Id == winnerId).SetPoints.Add(6);
Players.Find(p => p.Id != winnerId).SetPoints.Add(loserPoints);
}
Console.WriteLine(Winner.Id);
Players.ForEach(p => p.SetPoints = new List<int>());
}
这样你就可以在回合结束时重置每个玩家的SetPoints.
运行5次模拟后,我得到了这个输出
5
2
2
1
1
内容总结
以上是互联网集市为您收集整理的c# – Random()为相同类型的新对象分配相同的值全部内容,希望文章能够帮你解决c# – Random()为相同类型的新对象分配相同的值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。