首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在尝试获取一个随机数列表,我不想重复这些数字

我正在尝试获取一个随机数列表,我不想重复这些数字
EN

Stack Overflow用户
提问于 2020-08-11 16:47:03
回答 2查看 55关注 0票数 0

我有一个1加1的数组列表。随机数的范围是数组列表中的人数。

例如: NameList =>詹姆士,文斯,乔,约瑟夫,约翰

我希望输出是

NameListNum =>詹姆斯3,文斯2,乔5,约瑟夫1,约翰4

NameListNum =>詹姆斯2,文斯5,乔1,约瑟夫4,约翰3\

代码语言:javascript
复制
        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字符串,并重新生成一个随机数并将其重写为名称。

EN

回答 2

Stack Overflow用户

发布于 2020-08-11 17:05:53

假设它是随机生成的数的very easy to find the code to Shuffle a list,那么代码就像

代码语言:javascript
复制
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>

代码语言:javascript
复制
var namesList = new List<string>{"James", "Vince", "Joe", "Joseph", "John"}.Shuffle();

唯一的另一个变化是,您需要在下面的行中使用namesList.Count来代替namesList.Length

票数 1
EN

Stack Overflow用户

发布于 2020-08-11 17:10:55

好的,让我们一步一步来。您有一个名称列表,并且希望为每个名称分配一个唯一的随机数。随机数必须在[1, number of names in the list]范围内

天真的暴力方式是生成一个随机数,检查它以前是否被滚动过,如果没有,则将其分配给一个名称。按顺序对列表中的每个名称重复此过程,即可完成此操作。

有了4或5个名字,这实际上会运行得相当快,但它是等待的。更重要的是,当列表变得非常大时,就会达到浪费和执行糟糕的地步。为什么?嗯,你需要滚动很多次,而不是必要的。

有没有更好的方法?是。想象一下你的问题是:编写一个方法,在标准扑克中一个接一个地返回随机卡片?你会用同样的方式做吗?或者你会以某种方式储存和订购纸牌,洗牌,然后简单地一张张地分发卡片?

嗯,这里是一样的。您的标准牌只是一个从1到射手总数的有序列表:1, 2, 3, ...., numberOfShooters

现在,你会怎么洗牌呢。嗯,一种天真的方法是创建一个列表,然后随机选择一个索引,选择存储在该列表中的数字,然后将其从列表中删除,以避免再次滚动。这是可行的,但还是很浪费。为什么?因为重复移除列表中的项可能是昂贵的。请记住,列表只是标准数组的包装器;删除列表中的项需要将后面的所有数字在数组中向上移动。

在没有所有这些问题的情况下,一种简单的方法是使用linq (还有更好的方法,但在您的情况下应该足够了):

代码语言:javascript
复制
var numbersToShuffle = Enumerable.Range(1, numberOfShooters);
var rnd = new Random();
numbersShuffled = numbersToShuffle.OrderBy(i => rnd.Next());

剩下的事情应该很简单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63354668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档