从参数池中的随机值分配特定的初始参数

时间:2016-02-22 09:22:24

标签: c#

我正在使用函数来初始化构造函数的值。 在构造函数中,我调用此函数,并根据构造函数中传递的特定类型初始化参数。

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之间。

我可以分配值,然后读取它们,再次更改它们,但效率非常低。

1 个答案:

答案 0 :(得分:0)

我会以更多的OOP方式进行,因为它是C#。见下面的实现。

  1. 首先,我定义了一个定义合同的接口。从每个worker类型我们应该得到整数参数。不确定你的参数是怎样的,我只使用了一个整数数组。
  2. 然后我添加抽象类来共享一个代码,用于从给定的间隔生成N个随机数。
  3. 然后我只创建仅实现特定逻辑的具体类型。
  4. 为简单起见,我使用了LINQ辅助函数。 以下规则适用于获取随机数集:

    • 技师 - 来自区间[0,99]的2个值和来自[0,50]的5个值。注意int next函数min参数是包含的,而max参数是独占的。
    • 导演 - 来自区间[50,99]的2个值和来自[0,50]的5个值。
    • 经理 - 来自区间[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
          }
      }