Java 如何为学生随机设置课程?

Java 如何为学生随机设置课程?,java,java-8,Java,Java 8,我有两个字符串列表。其中一个包含200个字符串-学生姓名、id,另一个包含10个课程名称(数学、it等) 问题是:如何随机分配学生参加课程? 一个学生可以包含1到3门课程 我的代码: private List<String> generatedNames() { Faker names = new Faker(); return IntStream.range(0, 200).mapToObj(i -> names.name().firstName())

我有两个字符串列表。其中一个包含200个字符串-学生姓名、id,另一个包含10个课程名称(数学、it等)

问题是:如何随机分配学生参加课程? 一个学生可以包含1到3门课程

我的代码:

private List<String> generatedNames() {
  Faker names = new Faker();
  return IntStream.range(0, 200).mapToObj(i -> names.name().firstName())
          .collect(Collectors.toList());
}

private List<Integer> studentID() {
    Random random = new Random();
    return IntStream.range(0, 200).mapToObj(i -> random.nextInt(99999))
            .collect(Collectors.toList());
}

    public List<StudentConstructor> student() {
    List<String> name = generatedNames();
    List<Integer> id = studentID();
    List<String> course = setCourse();
    return IntStream.range(0, name.size()).mapToObj(i -> new StudentConstructor(name.get(i), id.get(i), course.get(i)))
            .collect(Collectors.toList());
}
private List generatedNames(){
伪造者名称=新伪造者();
返回IntStream.range(0200).mapToObj(i->names.name().firstName())
.collect(Collectors.toList());
}
私人名单学生ID(){
随机=新随机();
返回IntStream.range(0200).mapToObj(i->random.nextInt(99999))
.collect(Collectors.toList());
}
公开名单学生(){
列表名称=generatedNames();
列表id=studentID();
列出课程=设置课程();
返回IntStream.range(0,name.size()).mapToObj(i->newstudentconstructor(name.get(i),id.get(i),course.get(i)))
.collect(Collectors.toList());
}
这就是我设置课程的方式:

private List<String> setCourse(List<String> course) {
    List<String> names = generatedNames();
    int nTimes = names.size() / course.size();
    return course.stream().map(course -> Collections.nCopies(nTimes, course))
            .flatMap(List::stream).collect(Collectors.toList());
}
私人列表设置课程(列表课程){
列表名称=生成的名称();
int-nTimes=names.size()/course.size();
return course.stream().map(课程->集合.nCopies(时间,课程))
.flatMap(List::stream).collect(collector.toList());
}
但每门课程只为每个学生设置一次,如何为每个学生设置1到3次

例如:

名称1课程1、课程2、课程3

名称2课程2

名称3课程1,课程3


首先,似乎必须修改
学生
的现有数据模型,因为每个学生都应该被分配到多个课程:

@数据
@AllArgsConstructor
班级学生{
私有字符串名称;
私有int-id;
私有列表课程;//而不是单字符串课程
}
其次,最好使用该方法在所需范围内生成N个随机数

例如,假设有一个用户名的字符串数组,随机名称和ID可以如下生成:

static Random=new SecureRandom();
静态列表buildNames(){
返回random.int(200,0,names.length)
.mapToObj(i->名称[i])
.collect(Collectors.toList());
}
静态列表buildIds(){
return random.int(200,10\u 000,100\u 000)//生成5位唯一的随机ID
.distinct()
.boxed()
.collect(Collectors.toList());
}
类似地,可以生成每个学生的课程列表,提供随机数量的课程(假设有一个字符串数组
课程
):

static List buildCourses(){
返回IntStream
.范围(0,200)
.mapToObj(
a->随机
.int(1+random.nextInt(3),0,courses.length)
.mapToObj(i->courses[i])
.collect(收集器.toList())
)
.collect(Collectors.toList());
}
然后,可以这样创建
Student
的实例:

List name=buildNames();
List id=buildIds();
列出课程=构建课程();
IntStream.range(0,10)
.mapToObj(i->新学生(name.get(i)、id.get(i)、courses.get(i)))
.forEach(System.out::println);
示例输出:

tudent(name=Joan, id=26161, courses=[Ecology, Philosophy, French])
Student(name=Abe, id=56138, courses=[Chemistry, Architecture])
Student(name=Jim, id=87055, courses=[English, History])
Student(name=Jake, id=18101, courses=[Philosophy, History])
Student(name=Brian, id=38094, courses=[English, Web Design, Geometry])
Student(name=Jake, id=58020, courses=[Computer Science])
Student(name=Audrey, id=86903, courses=[German, Web Design, Ecology])
Student(name=Adele, id=97649, courses=[Philosophy, French, German])
Student(name=Jake, id=90515, courses=[German, French])
Student(name=Jane, id=19288, courses=[Computer Science])

我读了你的问题好几遍,但还是不明白你有什么,你想要什么。请重新措辞你的句子,清楚地表达你的要求。你还必须更准确地阐明要求。我想:所有的学生都应该至少有一节课,最多3节,都是随机的。。。此外,还有一个简单的解决方案:只需迭代您的学生列表。对于每个学生:洗牌课程列表(意思是:将它们随机排列)。然后创建一个介于1和3之间的随机数C。把第一节C课分配给那个学生。等等这会给你随机数目的类和随机类。