c# – 随机使用特定数量的特定值

我的问题是:我需要为调度创建一些随机值.例如,给出了处理时间.让我们说一台机器上的作业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)

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

最佳答案 我认为缺少现有答案的重点是:

“Is it possible to limit the random values, with guaranteeing that x%
of all my random values has the value 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 );
点赞