我正在使用函数来初始化构造函数的值。 在构造函数中,我调用此函数,并根据构造函数中传递的特定类型初始化参数。
public class myclass()
{
// class parameters of type int\
public myclass()
{
GenerateValues(1);
}
private void GenerateValues( int type_of_worker)
{
Random rnd = new Random();
//generate random values for the params
}
}
有了这个,我可以根据传递给构造函数的worker类型生成随机值,所以我可以有一个基本的工人,一个技术员,一个导演,一个经理等等。
每个角色都有要求,所以当我创建“经理”类型的工人时,它必须至少有2个参数超过50(最小0最大99)。如果是导演,则需要3个等于或大于75的参数。
如何告诉C#为X参数创建随机值,但如果类型为manager,其中2个必须大于50,或者如果是导演,则3个参数要高于75?
例如,如果我创建一个管理器,我会在GenerateValues中使用它:
// main parameters - any value between 1-99 is fine
par1 = rnd.Next(1.99);
par2 = rnd.Next(1.99);
par3 = rnd.Next(1.99);
par4 = rnd.Next(1.99);
par5 = rnd.Next(1.99);
//extra parameters - ANY 2 of these above 50 for manager
par6 = rnd.Next(1.99);
par7 = rnd.Next(50.99);
par8 = rnd.Next(50.99);
par9 = rnd.Next(1.99);
这里的问题是我不想指定哪个额外参数在50到99之间;但是希望任何2个额外参数必须在50到99之间。
我可以分配值,然后读取它们,再次更改它们,但效率非常低。
答案 0 :(得分:0)
我会以更多的OOP方式进行,因为它是C#。见下面的实现。
为简单起见,我使用了LINQ辅助函数。 以下规则适用于获取随机数集:
经理 - 来自区间[75,99]的3个值和来自[0,50]的5个值。
using System.Linq;
using System.Collections.Generic;
public interface IWorker {
int[] GetParameters();
}
abstract class Worker : IWorker {
public abstract int[] GetParameters();
protected IEnumerable<int> GenerateNValues(int quanity, int min, int max) {
var theRandom = new Random();
var theResult = new List<int>(quanity);
for (int i = 0; i < quanity; i++)
theResult.Add(theRandom.Next(min, max));
return theResult;
}
protected IEnumerable<int> Shuffle(IEnumerable<int> array) {
var theRandom = new Random();
return array.OrderBy(x => theRandom.Next()).ToArray();
}
}
class Technician : Worker {
public override int[] GetParameters() {
return GenerateNValues(2, 0, 100).Concat(GenerateNValues(5, 10, 51)).ToArray();
}
}
class Director : Worker {
public override int[] GetParameters() {
return GenerateNValues(2, 50, 100).Concat(GenerateNValues(5, 10, 51)).ToArray();
}
}
class Manager : Worker {
public override int[] GetParameters() {
return Shuffle(GenerateNValues(3, 75, 100).Concat(GenerateNValues(5, 10, 51))).ToArray();
}
}
public class MyClass
{
public MyClass(IWorker aWorker)
{
var theParameters = aWorker.GetParameters();
// do stuff with parameters
}
}