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