从一组数字a到b从0增加到n

时间:2014-06-27 22:22:00

标签: c#

示例:

起始编号:0

结束编号:147

选择1-26范围内的随机数。用这个数字增加起始编号,不断得到另一个随机数,直到我们达到结束编号​​。

也就是说,如果我们在137处,则意味着随机数必须在1到10之间。当我们达到144时,在1和3之间,依此类推。我尝试过使用modulo无济于事。

我尝试的代码示例:

int start = 0;
int finish = 0;
int highest = 26;

while(start <= finish) {
    int modulo = start % finish % highest;
    int random = (new Random()).Next(modulo);

    start += random;
}

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

要好得多将Random实例移出循环是必不可少的。否则除了最后几个之外的所有值都是相同的。

要获得动态范围内的数字,可以使用随机方法
 Next(int minValueInclusive, int maxValueExclusive)

int finish = 147; 

// untested
var generator = new Random();  // outside the loop
while(start < finish)          // stop when equal
{
    int range = finish-start;
    if (range > highest) range = highest;

    int random = generator.Next(1, range+1); 
    start += random;

    Console.Write('A' + random - 1);  // check
}

答案 1 :(得分:2)

我对您发布的示例的第一次观察,假设它是您实际尝试过的一个示例,那就是开始

int modulo = start % finish % highest;

将导致除以0错误,因为finish为0。

其次,我认为您要用

替换该行
int modulo = (finish - start) % highest;

第一项更有意义的是从开始到结束的距离,因为这是您在添加下一个随机数时不想超出的限制。

答案 2 :(得分:1)

在循环中,您需要逻辑运行以下步骤:

  1. 我现在的电话号码是多少? (start
  2. 我离结束有多远? (var distance = finish - start
  3. 我离结束的距离是26?如果是这样,我的最大值是25.否则,我的最大值是远离结束(var max = distance % 26 )或者如果模数混乱则可以使用完整的if语句
  4. 生成1到max之间的新随机数。
  5. 它看起来像这样:

    int start = 0;
    int finish = 144;
    int highest = 26;
    var rng = new Random();
    while(start <= finish) {
        var distance = (finish - start);
        var maxRange = distance % highest
    
        start += rng.Next(1,maxRange +1 );
    }
    

    (模数意味着你将始终在0和25之内)

答案 3 :(得分:-1)

这应该可行,只需在循环中使用简单的if。不需要模数。

int current = 0;
int high = 26;
int rand = 0;
int range;

while (current != 147)
{
range = 147 - current;
    if (range < high)
    {
    high = range;
    }
rand = (new Random().Next(1, high));

current += rand;
}