我试图实现Random类的扩展。
但是这个功能会有一个功能,你可以按照步骤获得一个数字。例如:
RandNumb(double min, double max, double step)
RandNumb(1, 10, 2) = 6
RandNumb(100, 1000, 500) = 1000
RandNumb(0.001, 0.1, 0.01) = 0.15
我的第一个想法是从最小值到最大值获得一个随机数,并比较这是否是一个有效数字(因为步骤)。如果没有,再次生成另一个号码。
但我确信这不是一个好的表现。你觉得怎么样?
答案 0 :(得分:5)
只需生成从min / step
到max / step
的数字,然后将生成的结果乘以step
。在这种情况下,每个结果都将是“有效的”。
在你的解决方案中有什么不好的地方 - 有机会永远不会得到“有效”的数字,这个数字是分步的。
答案 1 :(得分:2)
根据问题的定义,似乎“RandNumb(1,10,2)”的有效值为:1,3,5,7,9。
在那种情况下。代码看起来像:
class Program
{
static void Main(string[] args)
{
Random rd = new Random();
for (int i = 0; i < 10; i++)
{
Console.WriteLine("RandNumb(rd, 1, 10, 2)=" + RandNumb(rd, 1, 10, 2));
Console.WriteLine("RandNumb(rd, 100, 1000, 500)=" + RandNumb(rd, 100, 1000, 500));
Console.WriteLine("RandNumb(rd, 0.001, 0.1, 0.01) =" + RandNumb(rd, 0.001, 0.1, 0.01));
}
Console.ReadLine();
}
public static double RandNumb(Random rd, double min, double max, double step)
{
int range = (int)Math.Floor((max - min) / step);
int stepCount = rd.Next(0, range + 1);
return min + (step * stepCount);
}
}
结果看起来像这样:
RandNumb(rd, 1, 10, 2)=3
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,071
RandNumb(rd, 1, 10, 2)=5
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,041
RandNumb(rd, 1, 10, 2)=3
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,081
RandNumb(rd, 1, 10, 2)=9
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,011
RandNumb(rd, 1, 10, 2)=7
RandNumb(rd, 100, 1000, 500)=100
RandNumb(rd, 0.001, 0.1, 0.01) =0,091
RandNumb(rd, 1, 10, 2)=5
RandNumb(rd, 100, 1000, 500)=100
RandNumb(rd, 0.001, 0.1, 0.01) =0,001
RandNumb(rd, 1, 10, 2)=1
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,071
RandNumb(rd, 1, 10, 2)=1
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,061
RandNumb(rd, 1, 10, 2)=5
RandNumb(rd, 100, 1000, 500)=100
RandNumb(rd, 0.001, 0.1, 0.01) =0,041
RandNumb(rd, 1, 10, 2)=3
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,021
答案 2 :(得分:1)
这是一个解决方案:
public static class RandomExtensions
{
public static double RandNumb(
this Random @this,
double minimum, double maximum, double step)
{
var lowest = System.Math.Ceiling(minimum / step) * step;
var highest = System.Math.Floor(maximum / step) * step;
var numbers = (int)(1 + (highest - lowest) / step);
var index = @this.Next(0, (int)numbers);
return lowest + index * step;
}
}
我在LINQPad中针对此代码进行了测试,看起来效果很好。
var rnd = new Random();
rnd.RandNumb(1, 10, 2).Dump();
rnd.RandNumb(100, 1000, 500).Dump();
rnd.RandNumb(0.001, 0.1, 0.01).Dump();
rnd.RandNumb(7, 15, 3).Dump();
以下是我的输出示例:
4
1000
0.08
12