2

C# ライブラリに固有の System.Random を使用する以外に、これを適切に (または最善の方法で) MVC4 の C# に転送するにはどうすればよいでしょうか。System.Random は、メソッドが短時間連続して呼び出された場合、番号がランダムにならないため、扱いにくく負担が大きいように思えます。

私が抱えているもう 1 つの問題は、引用文字列を保持する予定のデータベースが成長し続ける場合、System.Random メソッドには Min と Max が必要であるということです。サイズを適切に調整するにはどうすればよいですか?

これは元の JavaScript コードです。

var which = Math.round(Math.random()*(Quotation.length - 1));

新しいQuotationで常に更新できるモデルから引っ張ることで、このJavaScriptコードを再現してより良い機能を持たせようとしています. このコードを変更し続ける必要はありません。

int ranNum;
Random random = new Random();
ranNum = random.Next(1,7);

引用符が増えるたびに...現在、7 つの引用文字列のいずれかをリストしますが、データベースの引用符が 7 から 9 に増加した場合は、戻って 7 を 9 に変更する必要があります。などなど。これは面倒です。もっと良い方法が必要です。

元の JavaScript コードは次のとおりです。

<script language="JavaScript">
function rotateEvery(sec)
{
var Quotation=new Array()
// QUOTATIONS
Quotation[0] = '<p>A journey of a thousand li begins with a single step.</p> Confucian Proverb.';
Quotation[1] = '<p>A picture is worth a thousand words.</p> Confucian Proverb.';
Quotation[2] = '<p>After all I have no nationality and am not anxious to claim any. Individuality is more than nationality.</p> Confucian Proverb.';
Quotation[3] = '<p>Be not ashamed of mistakes and thus make them crimes.</p> Confucian Proverb.';
Quotation[4] = '<p>He who counsels himself, counsels a fool.</p> Confucian Proverb.';
Quotation[5] = '<p>If thy strength will serve, go forward in the ranks; if not, stand still.</p> Confucian Proverb.';
Quotation[6] = '<p>Train equally the mind and body.</p> Confucian Proverb.';
var which = Math.round(Math.random()*(Quotation.length - 1));
document.getElementById('textrotator').innerHTML = Quotation[which];
setTimeout('rotateEvery('+sec+')', sec*1000);
}
</script>

前もって感謝します。

4

1 に答える 1

7

System.Random は、メソッドが短時間連続して呼び出された場合、番号がランダムにならないため、扱いにくく負担が大きいように思えます。

それは、基本的に、間違った使い方をしていることを意味します。乱数が必要になるたびに新しいインスタンスを作成するべきではありません。既存のインスタンスを再利用する必要があります。Randomただし、スレッドセーフではないため注意が必要です。基本的には、スレッドごとに 1 つのインスタンス、または (より単純ですが効率は劣ります) スレッド間で共有される単一のインスタンスが必要であり、スレッドの安全性の問題を回避するためにロックが必要です。

もっと詳しく説明した記事Randomがありますが、ここにあるコード サンプルを使用して、任意のスレッドの適切なインスタンスを取得できます。

using System;
using System.Threading;

public static class RandomProvider
{    
    private static int seed = Environment.TickCount;

    private static ThreadLocal<Random> randomWrapper = new ThreadLocal<Random>(() =>
        new Random(Interlocked.Increment(ref seed))
    );

    public static Random GetThreadRandom()
    {
        return randomWrapper.Value;
    }
}
于 2013-06-26T19:53:06.033 に答える