我怎么能改善这个C#的方法随机化? [英] How could I improve this C# randomising method?

查看:164
本文介绍了我怎么能改善这个C#的方法随机化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想我已经在此落户,作为一个随机化列表中最简单的单元测试的方法,但有兴趣听到任何改进。

 公共静态的IList< T> RandomiseList< T>(IList的< T>列表,INT种子)
{
随机随机=新的随机(种子);
名单< T> takeFrom =新的List< T>(名单);
名单< T> RET =新的List< T>(takeFrom.Count);

而(takeFrom.Count大于0)
{
INT POS = random.Next(0,takeFrom.Count - 1); $ B $(B T)项目= takeFrom [POS]
takeFrom.RemoveAt(POS)
ret.Add(项目);
}

返回RET;
}


解决方案

您想要一个洗牌,并做到这一点的最好办法是费雪耶茨洗牌:

 公共静态的IList< T>随机化< T>(IList的< T>列表,INT种子)
{
随机RNG =新的随机(种子);

名单< T> RET =新的List< T>(名单);
INT N = ret.Length;
,而(N大于1)
{
N--;
INT K = rng.Next第(n + 1);
//变量$ B $(B T)TMP =列表[K]简单交换;
保留[K] =保留[n]的;
RET [N] = tmp目录;
}
返回RET;
}


I think I've settled on this as the most simple and unit-testable method for randomising a list, but would be interested to hear of any improvements.

public static IList<T> RandomiseList<T>(IList<T> list, int seed)
{
    Random random = new Random(seed);
    List<T> takeFrom = new List<T>(list);
    List<T> ret = new List<T>(takeFrom.Count);

    while (takeFrom.Count > 0)
    {
        int pos = random.Next(0, takeFrom.Count - 1);
        T item = takeFrom[pos];
        takeFrom.RemoveAt(pos);
        ret.Add(item);
    }

    return ret;
}

解决方案

You want a shuffle, and the best way to do that is the Fisher-Yates shuffle:

public static IList<T> Randomise<T>(IList<T> list, int seed) 
{
    Random rng = new Random(seed); 

    List<T> ret = new List<T>(list);      
    int n = ret.Length;            
    while (n > 1) 
    {
        n--;                         
        int k = rng.Next(n + 1);  
        // Simple swap of variables
        T tmp = list[k];
        ret[k] = ret[n];
        ret[n] = tmp;
    }
    return ret;
}

这篇关于我怎么能改善这个C#的方法随机化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆