【问题标题】:Control over random value控制随机值
【发布时间】:2015-09-01 10:24:58
【问题描述】:

我使用随机浏览列表我喜欢这样:

var oServer = new SmtpServer("");
var random = new Random();
var randomIndex = random.Next(list.Count());
var socks = list[randomIndex];

oServer.SocksProxyServer = socks.IpAddress.ToString();
oServer.SocksProxyPort = socks.Port;

我希望如果选择了值,则下次不会再次选择该值。我希望它选择另一个值。

我该怎么办?

【问题讨论】:

  • 从列表中删除项目?
  • 我无法删除该项目,我需要价值
  • 在这种情况下,当您通过:indexList = Enumerable.Range(0, list.Count).ToList() 创建list 并使用它来获取要使用的索引(并从indexList 中删除项目)时,请创建一个新列表。跨度>
  • @Matthew Watson 你能给我这个答案吗?我认为你的回答很好
  • Dmitry Bychenko 发布的内容与我发布的答案相同,所以我认为他就是答案。

标签: c# list random


【解决方案1】:

如果您无法从list 本身中删除,请从possibleIndexes 中删除:

private static random = new Random();

...
List<int> possibleIndexes = Enumerable
  .Range(0, list.Count())
  .ToList();

...

int idx = random.Next(possibleIndexes.Count());
int index = possibleIndexes[idx];
possibleIndexes.RemoveAt(idx);
var socks = list[index];
...

【讨论】:

    【解决方案2】:

    如果您不想再次使用它,只需从列表中删除它:

    var socks = list[randomIndex];
    list.RemoveAt(randomIndex);
    

    【讨论】:

    • @FatiFleur 你应该在你的问题中提到这一点
    【解决方案3】:

    如果您不想丢失原始列表中的数据,请先将列表复制到另一个列表,然后从复制列表中删除项目

            var copyList=new List<yourListType>();
            copyList.AddRange(list);//copy form your orginal list
            var socks = copyList[randomIndex];
            copyList.RemoveAt(randomIndex);
    

    或者你可以生成唯一的随机数

         List<int> randomNumbers = new List<int>(list.Count());
    
            do
            {
                randomIndex = random.Next();
            } while (randomNumbers.Contains(randomIndex));
    
            randomNumbers.Add(randomIndex);
            var socks = list[randomIndex];
    

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多