我有一个1加1的数组列表。随机数的范围是数组列表中的人数。
例如: NameList =>詹姆士,文斯,乔,约瑟夫,约翰
我希望输出是
NameListNum =>詹姆斯3,文斯2,乔5,约瑟夫1,约翰4
或
NameListNum =>詹姆斯2,文斯5,乔1,约瑟夫4,约翰3\
foreach (var name in nameList)
{
counter++;
int randomNum = rand.Next(Decimal.ToInt32(numOfShooters))+1;
nameListNum.Add(name + " "+randomNum);
foreach (var item in nameListNum)
{
}
}我不知道我的方向是否正确,但第二个foreach循环将检查其他nameListNum字符串,并重新生成一个随机数并将其重写为名称。
发布于 2020-08-11 17:05:53
假设它是随机生成的数的very easy to find the code to Shuffle a list,那么代码就像
var namesList = new []{"James", "Vince", "Joe", "Joseph", "John"};
var numsList = Enumerable.Range(1,namesList.Length).ToList().Shuffle();
var namesNumsList = namesList.Select( (n,i) => $"{n} {numsList[i]}").ToList();现场示例:https://dotnetfiddle.net/MzOwQa
如果您想将这些名称随机化,请将它们设置为List<string>
var namesList = new List<string>{"James", "Vince", "Joe", "Joseph", "John"}.Shuffle();唯一的另一个变化是,您需要在下面的行中使用namesList.Count来代替namesList.Length
发布于 2020-08-11 17:10:55
好的,让我们一步一步来。您有一个名称列表,并且希望为每个名称分配一个唯一的随机数。随机数必须在[1, number of names in the list]范围内
天真的暴力方式是生成一个随机数,检查它以前是否被滚动过,如果没有,则将其分配给一个名称。按顺序对列表中的每个名称重复此过程,即可完成此操作。
有了4或5个名字,这实际上会运行得相当快,但它是等待的。更重要的是,当列表变得非常大时,就会达到浪费和执行糟糕的地步。为什么?嗯,你需要滚动很多次,而不是必要的。
有没有更好的方法?是。想象一下你的问题是:编写一个方法,在标准扑克中一个接一个地返回随机卡片?你会用同样的方式做吗?或者你会以某种方式储存和订购纸牌,洗牌,然后简单地一张张地分发卡片?
嗯,这里是一样的。您的标准牌只是一个从1到射手总数的有序列表:1, 2, 3, ...., numberOfShooters。
现在,你会怎么洗牌呢。嗯,一种天真的方法是创建一个列表,然后随机选择一个索引,选择存储在该列表中的数字,然后将其从列表中删除,以避免再次滚动。这是可行的,但还是很浪费。为什么?因为重复移除列表中的项可能是昂贵的。请记住,列表只是标准数组的包装器;删除列表中的项需要将后面的所有数字在数组中向上移动。
在没有所有这些问题的情况下,一种简单的方法是使用linq (还有更好的方法,但在您的情况下应该足够了):
var numbersToShuffle = Enumerable.Range(1, numberOfShooters);
var rnd = new Random();
numbersShuffled = numbersToShuffle.OrderBy(i => rnd.Next());剩下的事情应该很简单。
https://stackoverflow.com/questions/63354668
复制相似问题