将有关种子编号的对象列表随机化

时间:2019-03-14 12:23:08

标签: c#

我有一个对象:

public class Object{
    public String ID{get;set;}
} 

我的软件收到一个列表:

List<Object> objs = new List<Object>();
objs.add(new Object{ID = "1"});
objs.add(new Object{ID = "2"});
objs.add(new Object{ID = "3"});
objs.add(new Object{ID = "4"});

然后我将其随机化:

objs = objs.OrderBy(a => Guid.NewGuid()).ToList();
Debug.WriteLine(objs.ID);
// 1 4 2 3

如果我执行objs.OrderBy(a => Guid.NewGuid()).ToList();,我将收到另一个随机序列// 3 2 4 1

我需要传递一个“种子”(整数)并对该数字进行随机化,例如,如果我传递种子1时收到// 3 2 4 1,则当我再次执行数字1时我需要接收相同的订单// 3 2 4 1

有没有一种方法可以在c#中完成?

编辑:上面的对象只是一个例子,实际情况中我需要将以下对象随机化:

public class Object{
    public Int ID{get;set;}
    public String ImageTitle{get;set;}
    public String ImageDescription{get;set;}
    public String Url {get;set;}
} 

2 个答案:

答案 0 :(得分:2)

不是使用GUID,而是使用Random不仅可行而且容易:

var seed = 123;
var r = new Random(seed);
objs = objs.OrderBy(o => r.Next()).ToList();

You can see a live demo on rextester.

答案 1 :(得分:0)

使用此方法并缓存随机数组,然后再次提供服务。简单。

    private Dictionary<int, List<Object>> randoms=new Dictionary<int, List<Object>>();

    private List<Object> GetRandom(List<Object> objs,int? seed)
    {
        if (seed == null)
        {
            return objs.OrderBy(a => Guid.NewGuid()).ToList();
        }
        else
        {
            if (!randoms.ContainsKey(seed.Value))
            randoms[seed.Value] = objs.OrderBy(a => Guid.NewGuid()).ToList();

            return randoms[seed.Value];
        }
    }

示例调用GetRandom(objs,null)将始终对其进行随机化。如果您使用数字GetRandom(objs,1)进行调用,那么他将提供旧的随机数组。