示例:
起始编号: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;
}
有什么想法吗?
答案 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)
在循环中,您需要逻辑运行以下步骤:
start
)var distance = finish - start
)var max = distance % 26 )
或者如果模数混乱则可以使用完整的if语句max
之间的新随机数。 它看起来像这样:
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;
}