2

好吧,我一直在尝试随机化我的richtextbox的行,现在它开始困扰我,因为我正在使用随机但它不起作用......当我使用它时,它会多次重复一些行,并且根本不包括一些...

我看过:RichTextBox - 随机排序行

但这对我一点帮助都没有。

RichtextBox rtb = new RichTextBox();    
Random R = new Random();
int y;
rtb.Text = "";
for (int i = 0; i < richTextBox1.Lines.Length; i++)
{
   y = R.Next(0, richTextBox1.Lines.Length);
   rtb.Text = rtb.Text + richTextBox1.Lines[y].ToString() + "\r\n";
}
richTextBox2.Text = rtb.Text;

例如,如果我输入,

Lorem ipsum dolor sit amet, consectetur adipiscing elit。Nam in aliquam enim。Proin 在 lacus magna。Nam bibendum, augue non semper fringilla, ante est interdum ipsum, a egestas urna dolor vel risus。Phasellus eget dui non augue pretium ullamcorper at ac Tellus。Sed m​​attis risus 坐 amet metus dictum egestas。Phasellus tempus blandit enim,ac congue urna bibendum sed。Sed iaculis pulvinar dui vel tristique。Etiam justo metus, consequat in pellentesque eu, eleifend id nunc。

它给了我,

Sed m​​attis risus 坐 amet metus dictum egestas。Phasellus tempus blandit enim,ac congue urna bibendum sed。Nam bibendum, augue non semper fringilla, ante est interdum ipsum, a egestas urna dolor vel risus。Sed m​​attis risus 坐 amet metus dictum egestas。Phasellus tempus blandit enim,ac congue urna bibendum sed。Sed iaculis pulvinar dui vel tristique。Etiam justo metus, consequat in pellentesque eu, eleifend id nunc。Lorem ipsum dolor sit amet, consectetur adipiscing elit。Nam in aliquam enim。Proin 在 lacus magna。

重复一行,错过了一行……文本越长,它出现的频率越高。

我做 C# 的时间不长,如果这很简单,很抱歉。:/

4

2 回答 2

2

这是您在伪代码中的逻辑:

Foreach line in original
Choose a random line
Add it to the output

你永远不会考虑你已经输出了哪些行,因此不知道下次不选择它们。

请注意,在您提供的链接中,他们建议首先将行提取到一个结构中,然后对该结构进行变异以提供新的排序。这可确保您以每行结束一次。

有几种算法可以就地洗牌,最简单的是:

Select the first item
Select a random line, after or including the previous selection
Swap the two selections
Repeat moving the first selection to the left
于 2013-03-11T18:59:40.450 回答
1

随机意味着“只是” - 它会返回一个介于 0 和(富文本框中的行数 - 1)之间的数字。没有唯一性的保证(事实上这不太可能)。

如果您想以独特的顺序获取它们,则必须跟踪使用过的那些,并且不要再次使用它们。

一个简单的例子(不一定有效)

   List<int> usedLineIndexes = new List<int>();

   while (usedLineIndexes.Count < richTextBox1.Lines.Length)
   {
        int y = R.Next(0, richTextBox1.Lines.Length);
        if (usedLineIndexes.Contains(y))
            continue;   // Try again


        usedLineIndexes.Add(y);

        rtb.Text = rtb.Text + richTextBox1.Lines[y].ToString() + "\r\n";
   }

同样,这是未经测试的、低效的代码,但它会给你一个想法。

于 2013-03-11T18:58:34.287 回答