我在这里https://en.wikipedia.org/wiki/Secretary_problem读到有关秘书问题的信息
我对它的有效性感到怀疑,因为我确实采用了编码的方法来证明它。
问题表明,根据概率分析,最合适的候选者很可能会在1 / e中找到,即在37%的第一批候选者中。
我试图用代码(JAVA)可视化此内容。我尝试的是以下内容:-
- 在测试中将候选人的排名随机填写在列表中。
- 找到排名1的位置。这意味着最佳测试所需的特定测试所需的候选人百分比是排名1的位置。
- 运行一些此类迭代。
- 平均计算出用于迭代的最佳候选位置。
package com.pravesh.designpattern.creational;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
public class HiringProblem {
public static void main(String[] args) {
Random rd = new Random();
int numberOfCandidates = 1000;
int numberOfTests = 10000;
List<Double> bestCandidatePositionPositionPercentages = new ArrayList<>();
for (int testNumber = 0; testNumber < numberOfTests; testNumber++) {
// Generate a random array of candidates with their rankings
List<Integer> candidateRankings = new ArrayList<>();
int candidateRanking = 0;
while (candidateRanking < numberOfCandidates) {
int random = rd.nextInt(numberOfCandidates + 1);
if (!candidateRankings.contains(Integer.valueOf(random)) && random > 0
&& random <= numberOfCandidates) {
candidateRanking++;
candidateRankings.add(Integer.valueOf(random));
}
}
// Index starts from 0 and hence position+1
int bestCandidatePosition = candidateRankings.indexOf(1) + 1;
double bestCandidatePositionPercentage = (((double) bestCandidatePosition) / numberOfCandidates) * 100;
bestCandidatePositionPositionPercentages.add(bestCandidatePositionPercentage);
}
double averagedBestPositionsPercentage = bestCandidatePositionPositionPercentages.stream()
.collect(Collectors.summingDouble(n -> n)) / bestCandidatePositionPositionPercentages.size();
System.out.println((int) averagedBestPositionsPercentage);
}
}
我原本希望平均值为37%,但是大多数时间我每次运行该程序时,平均值都在45-53之间。
有人可以让我知道这种方法是否缺少某些东西。