Eri*_*ert 22
到目前为止,有三个人告诉过你使用Ticks的最后一位数字.这不起作用.尝试在紧密循环中这样做,你很快就会明白为什么这是一个坏主意.
问题不是很好.我喜欢在面试中提出含糊不清的问题,因为你可以找出候选人如何处理一个模棱两可的情况.在这种情况下,我会立即回过头来,通过"随机"找出面试官的意思.伪随机性是否足够好?是否有高质量熵的来源?
一旦你有一个澄清的问题,它应该更容易回答.
问题归结为管理熵.如果你有一个非常弱的熵源 - 比如Ticks的值(不是最后一个数字,这是没有价值的,而是整个值)那么你可以使用它来为一个伪随机数生成器播种.如果您拥有高质量的熵源,那么您可以直接使用它来生成随机位.
保证是随机的.(舌头FIRMLY在脸颊):
void Main()
{
Enumerable.Range(0, 10).Select(x => ComeOnItsKindaRandom(0, 10)).Dump();
}
public int ComeOnItsKindaRandom(int minValue, int maxValue)
{
var query = "http://www.random.org/integers/?num=1&min={0}&max={1}&col=1&base=10&format=plain&rnd=new";
var request = WebRequest.Create(string.Format(query, minValue, maxValue));
var response = request.GetResponse();
using(var sr = new StreamReader(response.GetResponseStream()))
{
var body = sr.ReadToEnd().Trim();
return int.Parse(body);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只想从数组中获取一个项而不使用Random该类,则可以使用modulo具有未知值的函数,例如DateTime.Now.Ticks:
string[] items = new[] { "1", "2", "3", "4", "5" };
// Modulo items.Lenth returns a value from 0 to Length - 1
int index = (int)(DateTime.Now.Ticks % items.Length);
Console.WriteLine(items[index]);
Run Code Online (Sandbox Code Playgroud)
我会用
DateTime.Now.Tick
Run Code Online (Sandbox Code Playgroud)
然后取足够的数字,例如 Math.Random(10),我将只取最后两个数字。
或者您可以像下面这样取此刻度的模:
public static class MyMath
{
private static int counter = 1;
public static int Random(int max)
{
counter++;
long ticks = DateTime.Now.Ticks;
int result = Math.Abs((int) (ticks/counter)%max);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅以下测试:
[Test]
public void test()
{
List<int> test = new List<int>();
for (int i = 0; i < 10; i++)
{
test.Add(MyMath.Random(100));
}
Console.WriteLine("result:");
foreach (int i in test)
{
Console.WriteLine();
}
}
Run Code Online (Sandbox Code Playgroud)