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

标签 c# javascript random

除了使用 C# 库中固有的 System.Random 之外,您如何将其正确(或最佳方式)转移到 MVC4 中的 C#。 System.Random 看起来过于笨重和繁琐,因为如果该方法被短时间连续调用,数字就不会变成随机的。

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

这是原始的 JavaScript 代码。

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

我正在尝试通过从可以使用新报价不断更新的模型中提取来重现此 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>

提前谢谢你。

最佳答案

System.Random seems far to clunky and burdensome because if the method gets called in short succession, the number doesn't become random.

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

我有一个 article其中涉及更多细节,但这里有一个代码示例,您可以使用它为任何线程获取适当的 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;
    }
}

关于c# - C# MVC4.0 中的有效 Math.Random,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17329211/

相关文章:

c# - System.Runtime.Cache 不会过期?

c# - 检查列表 <> 项目,如果它包含相同的项目,则复制它们并将其从列表 <> 中删除

c# - Scope_Identity 不能在 c# 上使用 GUID

javascript - 在 iOS 中使用 Javascript 复制到剪贴板

python - 线性同余发生器 - 弱测试结果

c# - 在 C# 中使用像 XVid 这样的视频编解码器

javascript - AngularJS 中的多个 View 、多个解析但针对一个 Controller

php - 在 PHP/Mysql 中生成随机数作为主键

python - 在 Python 中生成随机字符

javascript - 如何将此文件导入到 VueJS 中?