簡體   English   中英

如何從一個列表的屬性中獲取隨機值?

[英]How to get random value from property from one List?

我有一個10,000個Element類型的條目的列表:

public class Element
{
    public Element()
    {
        this.Id = Guid.NewGuid();
    }

    public Guid Id { get; set };
}

我還有另一個Link類型為5,000的條目的列表:

public class Link
{
    public Link(Guid ElementOne, Guid ElementTwo)
    {
        this.ElementOne = ElementOne;
        this.ElementTwo = ElementTwo;
    }

    public Guid ElementOne { get; set; }
    public Guid ElementTwo { get; set; }
}

我在這里填充列表:

for (int i = 0; i < 10,000; i++)
    this.ListOfElements.Add(new Element());

for (int i = 0; i < 5,000; i++)
{
    this.ListOfLinks.Add(new Link(need ElementOne, need ElementTwo));
}

我不確定ElementOneElementTwo要通過什么。 我想從元素列表( Element.Id )中獲取兩個參數的隨機ID,並確保它們是唯一的( ElementOne永遠不會是ElementTwo )。

聽起來您只需要兩個隨機數。 如果碰巧有重復,可以進行比較和查詢。

for (int i = 0; i < 5,000; i++)
{
    int ele1 = Random.NextInt(10000);
    int ele2 = Random.NextInt(10000);

    while(ele1 == ele2){
        ele2 = Random.NextInt(10000);
    }
    this.ListOfLinks.Add(new Link(ListOfElements[ele1], ListOfElements[ele2]));
}

下面的代碼將給您的列表一個隨機的索引數組。 因此,您可以采用randIndex [0]和randIndex [1]來獲得兩個隨機項。

            Random rand = new Random();
            List<string> myList = new List<string>() { "a","b","c"};
            int[] randIndex = myList.Select((x,i) => new {i = i, rand = rand.Next()}).OrderBy(x => x.rand).Select(x => x.i).ToArray();

您需要找到未使用的下一個元素,也可以使用.OrderBy(i => Guid.NewGuid())獲得隨機元素

private Element GetNextAvaibaleElement() {
  var usedElementIds = listOfLinks.Select(i => i.ElementOne).Union(listOfLinks.Select(i => i.ElementTwo));
  return listOfElements.Where(i => !usedElementIds.Contains(i.Id)).OrderBy(i => Guid.NewGuid()).FirstOrDefault();
}

然后得到兩個可用的元素

for (int i = 0; i < 5,000; i++)
{
    this.ListOfLinks.Add(new Link(GetNextAvaibaleElement().Id,GetNextAvaibaleElement().Id));
}

在這里看到這個dotnet小提琴

在某處創建Random類的實例。

例如

static Random rdm = new Random();

然后,使用該rdm實例生成一個隨機整數,從列表中刪除該元素(以免重復使用),並繼續進行直到您耗盡列表。

List<Element> listOfElements; // list of 10k Elements

for (int i = 0; i < 5,000; i++)
{
    int r = rdm.Next(listOfElements.Count);
    Element elementOne = listOfElements[r]; 
    listOfElements.RemoveAt(r);
    r = rdm.Next(listOfElements.Count);
    Element elementTwo = listOfElements[r]; 
    this.ListOfLinks.Add(new Link(elementOne, elementTwo));
}

解決此問題的一種方法是創建一個整數列表,該整數列表表示ListOfElements的索引,然后以隨機方式對該列表進行排序。 然后,您可以按索引簡單地引用ListOfElements的項目,依次瀏覽隨機索引列表:

private static void Main()
{
    for (int i = 0; i < 10000; i++) ListOfElements.Add(new Element());

    // Create a randomly-ordered list of indexes to choose from
    var rnd = new Random();
    var randomIndexes = Enumerable.Range(0, ListOfElements.Count)
        .OrderBy(i => rnd.NextDouble()).ToList();

    // Now use our random indexes to pull unique items from the Element list
    for (int i = 0; i < 10000; i += 2)
        ListOfLinks.Add(new Link(ListOfElements[randomIndexes[i]].Id,
            ListOfElements[randomIndexes[i + 1]].Id));

    GetKeyFromUser("\nDone! Press any key to exit...");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM