C# 具有特定值的特定量的随机

C# 具有特定值的特定量的随机,c#,random,percentage,C#,Random,Percentage,我的问题如下:我需要为调度创建一些随机值。例如,给出了处理时间。假设一台机器上的作业j得到一个介于(1,99)之间的随机值。这就是作业在这台机器上需要的时间 现在,我需要处理这些随机值。我想说的是,在所有随机过程时间中,20%是零过程时间。那么,有人知道如何在特定的时间内给一个整数数组一个特定的量吗 此处为正常随机: p_machine_job_completionTime = new int[Constants.numberMachines][]; for (i = 0; i

我的问题如下:我需要为调度创建一些随机值。例如,给出了处理时间。假设一台机器上的作业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);
            }
        }

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

我认为您不需要在您的案例中包含这一点。您可以简单地使用模作为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++;
        }
    }
p_machine_job_completionTime=new int[Constants.numberMachines][];
int计数器=0;
对于(i=0;i
一种方法是生成两个随机值:一个用于确定是否使用0,另一个(可能)用于生成非零值。但是,您可以将两个随机数合并为一个,方法是将随机值的范围增加适当的数量,并将超出限制的任何结果转换为0:

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

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

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

Random random;

...

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

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

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

如果你需要保证在一天结束时,某个恰好x%的随机项目的值为零,那么你不能像@Douglas的回答那样使用随机。正如@Douglas所说,“以20%的概率得到0。”但正如问题中所述,我们不想要20%的概率,我们想要20%的概率,而另80%的概率是随机值。我认为下面的代码符合您的要求。为
numberMachines
numberJobs
填写一些值,以便运行代码

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 );
int numberMachines=5;
int numberJobs=20;
随机=新随机();
var p_machine_job_completionTime=new int[numberMachines][];
var theTwentyPercent=new HashSet(可枚举的.Range(0,(numberJobs*numberMachines)-1).OrderBy(x=>Guid.NewGuid()).Take(Convert.ToInt32((numberMachines*numberJobs)*0.2));
对于(int i=0;ix).Count(val=>val==0)==(numberMachines*numberJobs)*0.2);

这将创建20/119=16,80%的零。他想要20%:-)但这并不能保证20%是零。
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 );