C#MVC4.0中有效的Math.Random

use*_*784 2 javascript c# random

除了使用C#库中固有的System.Random之外,您如何将此正确(或最佳方式)传输到MVC4中的C#.System.Random似乎很笨重和繁琐,因为如果该方法被短时间连续调用,则该数字不会变得随机.

我遇到的另一个问题是System.Random方法需要Min和Max,如果我将要保持Quotation字符串的数据库不断增长,如何正确调整大小?

这是原始的JavaScript代码.

var which = Math.round(Math.random()*(Quotation.length - 1));
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过从可以使用新报价不断更新的模型中提取来重现此JavaScript代码以获得更好的功能.我不想继续更改此代码:

int ranNum;
Random random = new Random();
ranNum = random.Next(1,7);
Run Code Online (Sandbox Code Playgroud)

每次报价增加......现在,它将列出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>
Run Code Online (Sandbox Code Playgroud)

先感谢您.

Jon*_*eet 7

System.Random似乎很笨重和繁琐,因为如果该方法被短时间连续调用,则该数字不会变得随机.

这只是意味着你错误地使用它,基本上.每次需要随机数时都不应该创建新实例 - 您应该重用现有实例.但是,您需要小心,因为Random它不是线程安全的.您基本上希望每个线程有一个实例,或者(更简单但效率更低)线程之间共享的单个实例,并通过锁定来避免线程安全问题.

我有一篇文章更详细,但是这里有一个代码示例,您可以使用它来获取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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1760784当您调用`GetThreadRandom`获取Random实例时,Max/Min会进入播放状态.接下来你将使用你的最小值和最大值调用它上面的"Next".所有这些代码都在创建一个可重用的每线程Random实例(因为Random不是线程安全的,并且每个线程实例比锁定一个实例更有效).它使用种子上的interlocked.increment来确保如果两个线程几乎在完全相同的时间(到滴答计数相同)创建一个随机实例,它们仍会得到单独的种子. (2认同)