0

我正在尝试让我的扭曲方法执行以下操作:

存储一个数字(结果)
生成一个随机数并将其添加到结果
我到目前为止的代码是:

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 应该只在每次扭曲时递增方法被调用。

4

5 回答 5

3

将“结果”存储在方法之外。我也倾向于使随机生成器成为静态的,并且它倾向于记住它在每次调用时生成的数字。

最好保持 Random 静态,因为正如 Marc Gravell 所述,“每次执行 new Random() 时,它都会使用时钟进行初始化。这意味着在紧密循环中,您会多次获得相同的值。您应该保留一个 Random实例并继续在同一个实例上使用 Next。”

查看 -随机数生成器仅生成一个随机数以获取更多信息和报价来源。

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;
}
于 2012-04-16T23:05:21.683 回答
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。如果将其提取到字段中,则在创建对象时将其初始化为 0,并且每次调用都会将其twist递增,而无需每次都重置它。

于 2012-04-16T22:46:58.807 回答
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());
}
于 2012-04-16T22:54:08.083 回答
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(或 Session 变量),否则它将在您网页上发生的每个操作中被重置。

注意 2:随机是静态的,因为每个实例都依赖于系统时钟,所以您只有一个实例并调用.Next(min, max)该实例以获取另一个随机数。

于 2012-04-17T13:57:03.907 回答
0

取决于您所说的“存储它”是什么意思。在哪里排序?全球?一份文件?数据库?我猜你的意思是一个全局的,在这种情况下,将你的结果变量声明在twist方法的范围之外

于 2012-04-16T22:49:10.297 回答