日期:2014-05-17  浏览次数:21119 次

C# 如何输出随机行
textbox1 里有若干行数据,如:

111111
222222
333333
444444
555555

要如何将这些数据随机输出到textbox2?例如输出后为如下这种随机的行,不要按顺序输出。

222222
555555
111111
333333
444444

------解决方案--------------------
请百度"洗牌算法"
------解决方案--------------------
List<string> list=new List<string>();
list.Add("111111");
list.Add("222222");
list.Add("333333");
.......

List<string> resultList=new List<string>();
Random rnd=new Random();

while(list.Count>0)
{
  string str= list[rnd.Next(0,list.Count)];
  resultList.Add(str);
  list.Remove(str);
}

resultList这里面就是随机后的了

------解决方案--------------------
其实所谓的随机数,并不是真正的随机数。从概率上来说随机应该是平均分布,而不是正态分布。
以前在CoolShell上看到一篇文章讨论洗牌算法,并列出了几种算法洗牌后,每张牌出现位置的统计,基本谈不上随机。最后给出了一个算法,翻译成C#大概是下面的样子,楼主参考:
static void ShuffleArray_Fisher_Yates(List<string> arr, int len)
{
Random r = new Random(1);

int i = len, j;
string temp;
if (i == 0) return;
while (--i > 0)
{
j = r.Next(100000) % (i + 1);
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}

------解决方案--------------------
就用Random随机读一行,删除一行!
------解决方案--------------------
引用:
Quote: 引用:

text2.Text = string.Join("\r\n", text1.Lines.OrderBy(x => Guid.NewGuid().ToString()));


会报错
与“string.Join(string, string[])”最匹配的重载方法具有一些无效参数
无法从“System.Linq.IOrderedEnumerable<string>”转换为“string[]”

VS2008加上一个ToArray()

text2.Text = string.Join("\r\n", text1.Lines.OrderBy(x => Guid.NewGuid().ToString()).ToArray());