随机使用特定数量的特定值

时间:2014-01-28 17:47:08

标签: c# random percentage

我的问题如下:我需要为调度创建一些随机值。例如,给出了处理时间。让我们说一台机器上的作业j得到一个随机值(1,99)。这就是这台机器上工作所需的时间。

现在,我需要操纵这个随机值。我喜欢说所有随机处理时间,其中20%是零处理时间。那么有人知道如何给定一个具有特定时间的整数的数组吗?

这里是正常的随机:

p_machine_job_completionTime = new int[Constants.numberMachines][];
        for (i = 0; i < Constants.numberMachines; i++)
        {
            p_machine_job_completionTime[i] = new int[Constants.numberJobs];
            for (j = 0; j < Constants.numberJobs; j++)
            {
                p_machine_job_completionTime[i][j] = random.Next(1, 99);
            }
        }

现在,作业可以跳过一台机器,因此处理时间为0.是否可以限制随机值,同时保证所有随机值的x%都为0? 例如:

20% of p_machine_job_completionTime[i][j] = 0
80% of p_machine_job_completionTIme[i][j] = random (1,99)

我非常感谢任何小小的建议。

4 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是生成两个随机值:一个用于确定是否使用0,另一个用于生成非零值。但是,您可以通过将随机值的范围增加适当的数量并将高于限制的任何结果转换为0来将两个random合并为一个:

int val = random.Next(1, 123);
if (val >= 99)
    val = 0;

在这种情况下,您的目标范围包含98个可能的值(1到98,因为上限是独占的)。要以20%的概率得到0,您需要将随机生成器的范围扩展到1 /(1 - 20%),或者将其当前值的125%扩展为123.

答案 1 :(得分:1)

只分开两种情况:当0应该返回时为20%,当结果为1..99时为80%

Random random;

...

int value = random.Next(5) == 0 ? 0 : random.Next(99) + 1;

答案 2 :(得分:0)

我认为在您的情况下,您不需要在Random中包含此内容。你可以简单地使用modulo作为for循环的一部分:

    p_machine_job_completionTime = new int[Constants.numberMachines][];
    int counter = 0;  
    for (i = 0; i < Constants.numberMachines; i++)
    {
        p_machine_job_completionTime[i] = new int[Constants.numberJobs];
        for (j = 0; j < Constants.numberJobs; j++)
        {
              if( counter%5 == 0)
              {
                 p_machine_job_completionTime[i][j] = 0;
              }
              else
              {
                 p_machine_job_completionTIme[i][j] = random (1,99);                         
              }
              counter++;
        }
    }

答案 3 :(得分:0)

我认为缺少现有的答案是重要的一点:

  

“是否可以限制随机值,保证 x%   所有随机值的值都为0“

如果您需要保证在一天结束时某些随机完全 x%的项目被赋予零值,那么您无法使用随便在@Douglas的回答中。正如@Douglas所说,“以20%的概率获得0”。但正如问题中所述,我们不希望20%的概率,我们想要20%,而另一个恰好80%具有随机值。我认为下面的代码可以满足您的需求。填写numberMachinesnumberJobs的某些值,以便运行代码。

int numberMachines = 5;
int numberJobs = 20;
Random random = new Random();
var p_machine_job_completionTime = new int[numberMachines][];
var theTwentyPercent = new HashSet<int>(Enumerable.Range(0,(numberJobs * numberMachines) -1 ).OrderBy(x => Guid.NewGuid()).Take(Convert.ToInt32((numberMachines * numberJobs) * 0.2)));

for (int i = 0; i < numberMachines; i++) {
    p_machine_job_completionTime[i] = new int[numberJobs];
    for (int j = 0; j < numberJobs; j++) {
        int index = (i * numberJobs) + j;
        if (theTwentyPercent.Contains(index)) {
            p_machine_job_completionTime[i][j] = 0;
        }
        else {
            p_machine_job_completionTime[i][j] = random.Next(1, 99);
        }
    }
}

Debug.Assert( p_machine_job_completionTime.SelectMany(x => x).Count(val => val==0) == (numberMachines * numberJobs) * 0.2 );