我正在尝试使用我的扭曲方法来执行以下操作:
存储号码(结果)
生成一个随机数并将其添加到结果中
我到目前为止的代码是:
public int twist(int min, int max)
{
int result = 0;
Random random = new Random();
int y = random.Next(min, max);
result += y;
System.Diagnostics.Debug.WriteLine(result);
return result;
}
所有这一切都是每次生成一个新数字,因为我没有存储它,我认为我不需要循环,但我需要在每次y增量后存储结果,并且y应该只增加每个调用扭曲方法的时间。
答案 0 :(得分:3)
将“结果”存储在方法之外。我也倾向于使随机发生器保持静态,并且它倾向于记住每次调用时产生的数字。
最好保持随机静态,因为正如Marc Gravell所说“每次你做新的Random()时都会使用时钟进行初始化。这意味着在紧密的循环中你可以获得相同的值很多次。你应该保持一个Random实例并继续在同一个实例上使用Next。“
请查看 - Random number generator only generating one random number以获取更多信息和报价来源。
private int _result = 0;
private static Random _rand = new Random();
public int twist(int min, int max)
{
int y = _rand.Next(min, max);
_result += y;
System.Diagnostics.Debug.WriteLine(_result);
return _result;
}
答案 1 :(得分:2)
尝试:
private int result;
private Random random = new Random();
public int twist(int min, int max)
{
int y = random.Next(min, max);
result += y;
System.Diagnostics.Debug.WriteLine(result);
return result;
}
因为需要通过对同一方法的多次调用来访问result
,所以需要将其设置为字段而不是变量。在您的版本中,每次调用twist
都会创建一个新变量并将其设置为0.如果将其提取到字段中,则在创建对象并且每次调用{{1}时将其初始化为0每次都不增加它而增加它。
答案 2 :(得分:1)
这是一个简洁的小方法,只要你迭代IEnumerable
,就会返回任意数量的随机数之和。
public IEnumerable<int> Twist(int min, int max) {
Random random = new Random();
int result = 0;
while (true) {
result += random.Next(min, max); // overflow pretty likely for large max
System.Diagnostics.Debug.WriteLine(result);
yield return result;
}
}
// For a single element
int oneResult = Twist(1, 5).First();
// For the fifth
int fifth = Twist(1, 5).Skip(4).First();
如果你想推迟迭代,只是为了踢,定义一个很好的扩展方法:
public static class EnumeratorExt {
public static T Next<T> (this IEnumerator<T> seq) {
if (seq.MoveNext()) {
return seq.Current;
}
return default(T);
}
}
// Now call it like so!
using (var generator = Twist(5, 10).GetEnumerator()) {
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
}
答案 3 :(得分:1)
private static int result = 0;
private static Random random = new Random();
public int twist(int min, int max)
{
int y = random.Next(min, max);
result += y;
System.Diagnostics.Debug.WriteLine(result);
return result;
}
基本上,您需要在方法之外声明result
,以便不会创建它,并且每次都设置为零。
注意:如果您使用的是.aspx.cs文件,则可能还需要将其声明为static
(或会话变量),否则将在您网页上发生的每个操作中重置它。 / p>
注2:Random是静态的,因为每个实例都取决于系统时钟,因此您只需要一个实例并在该实例上调用.Next(min, max)
来获取另一个随机数。
答案 4 :(得分:0)
取决于“存储它”的含义。把它排序在哪里?全球?一份文件?一个数据库?我猜你的意思是全局,在这种情况下,将结果变量声明在扭曲方法的范围之外