Java 为这个兰德发电机提出一些更优化的解决方案
我有一个函数“generateRan”,可以生成随机数。此功能无法更改Java 为这个兰德发电机提出一些更优化的解决方案,java,algorithm,random,Java,Algorithm,Random,我有一个函数“generateRan”,可以生成随机数。此功能无法更改 int generateRan() { Random num = new Random(); return (1 + num.nextInt(100)); } 我必须编写以下代码: 随机打印数字1-20 随机打印数字1-200 每个数字只能打印一次 该功能可以使用任意次数。但是它有点重,所以我想让代码更加优化 以下是我编写的代码: import java.util.ArrayList; import jav
int generateRan() {
Random num = new Random();
return (1 + num.nextInt(100));
}
我必须编写以下代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList();
Test t = new Test();
iniList(list, 20);
for (Integer i = ((t.generateRan()) % 20); list.size() > 0; i = 1+((t
.generateRan()) % 20)) {
if (list.contains(i.toString())) {
list.remove(i.toString());
System.out.println(i);
}
}
System.out.println("********");
iniList(list, 200);
for (Integer i = ((t.generateRan()%2)*100 + t.generateRan()) ; list.size() > 0; i = ((t.generateRan()%2)*100 + t.generateRan())) {
if (list.contains(i.toString())) {
list.remove(i.toString());
System.out.println(i);
}
}
}
private static void iniList(List list, int i) {
for (Integer k = 1; k <= i; k++) {
list.add(k.toString());
}
}
int generateRan() {
Random num = new Random();
return (1 + num.nextInt(100));
}
}
import java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
公开课考试{
公共静态void main(字符串[]args){
列表=新的ArrayList();
测试t=新测试();
名单(名单,20);
对于(整数i=((t.generateRan())%20);list.size()>0;i=1+((t
.generateRan())%20){
if(list.contains(i.toString())){
list.remove(i.toString());
系统输出打印LN(i);
}
}
System.out.println(“**********”);
iniList(列表,200);
对于(整数i=((t.generateRan()%2)*100+t.generateRan());list.size()>0;i=((t.generateRan()%2)*100+t.generateRan()){
if(list.contains(i.toString())){
list.remove(i.toString());
系统输出打印LN(i);
}
}
}
私有静态列表(列表列表,int i){
对于(整数k=1;k
每个数字只能打印一次
然后,您只需创建整个范围的列表
,然后调用
private static void displayNumber(int-minInclusive,int-maxInclusive){
列表=新的ArrayList();
对于(int i=minInclusive;i我将使用集合而不是列表来重新编译,因为它在搜索重复项时更快
Set<Integer> set = new HashSet<Integer>();
for(int i = 0; i < 20;) {
Integer r = generateRan();
if(set.add(r)) {
System.out.println(r);
++i;
}
}
Set Set=newhashset();
对于(int i=0;i<20;){
整数r=generateRan();
如果(集合添加(r)){
系统输出println(r);
++一,;
}
}
假设您必须使用generateRan()函数,否则请使用Collections.shuffle,如图所示
public static void main(String[] args) {
List<Integer> list = new ArrayList();
initList(list, 200);
while (list.size() > 0) {
int index = generateRan() % list.size();
System.out.println(list.remove(index));
}
}
public static void initList(List<Integer> s, int size) {
for (int i = 1; i <= size; i ++)
s.add(i);
}
public static int generateRan() {
Random num = new Random();
return (1 + num.nextInt(100));
}
publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
初始列表(列表,200);
while(list.size()>0){
int index=generateRan()%list.size();
System.out.println(list.remove(index));
}
}
公共静态void initList(列表s,整数大小){
对于(inti=1;i首先,您不应该创建newrandom()
每次调用函数时。这几乎保证会给您非随机结果。是的,我知道……但这是一种强迫,无法改变……您看到的任何其他缺陷?检查一个最著名的算法以生成随机结果Number@user1433826:也许您在心里将RNG建模为一个服务,构造函数创建了一个i与该服务的接口。相反,您应该在心里将其建模为一个状态机。构造函数类似于internalstate=somefunction1(currentTime);
对generateNumber
的每次调用都是returnvalue=generator(internalstate);internalstate=somefunction2(internalstate);
。安全的随机数生成器通常使用somefunction2(熵)
,在这种情况下,创建新的随机数实例可能效率低下,但不一定是错误的。巧妙但不错的方法+1;)这对1-200的情况不起作用,或者至少它不是完全随机的。例如,101-200不能是第一个选择的数字。
public static void main(String[] args) {
List<Integer> list = new ArrayList();
initList(list, 200);
while (list.size() > 0) {
int index = generateRan() % list.size();
System.out.println(list.remove(index));
}
}
public static void initList(List<Integer> s, int size) {
for (int i = 1; i <= size; i ++)
s.add(i);
}
public static int generateRan() {
Random num = new Random();
return (1 + num.nextInt(100));
}