2

まあ、私はリッチテキストボックスの行をランダム化しようとしてきましたが、ランダムを使用しているのでバグが発生し始めていますが、機能していません...これを使用すると、いくつかの行が複数回繰り返され、一部をまったく含まない...

私が見た: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 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 sit 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 sit 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 sit 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. アリクアム・エニムのナム。ラクス・マグナでプロイン。

1行が繰り返され、1行が抜けているところ...長いテキストではより頻繁に発生します。

私は C# をあまり長くやっていないので、これが単純な場合は申し訳ありません。:/

4

2 に答える 2

2

疑似コードでのロジックは次のとおりです。

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

すでに出力した行を考慮しないため、次回それらを選択しないことを知りません。

あなたが提供したリンクでは、最初に行を構造に抽出し、次にその構造を変更して新しい順序を提供することを推奨していることに注意してください。これにより、各行が 1 回で終わることが保証されます。

適切なシャッフルにはいくつかのアルゴリズムがありますが、最も単純なものは次のとおりです。

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 に答える