1. Utilice la impresión colaborativa multiproceso de Java 1 an
Los requisitos de la asignatura son los siguientes:
Para un entero n dado, inicie n subprocesos (numerados de 1 an respectivamente).
La lógica de trabajo del hilo es: el hilo numerado x solo puede imprimir el entero x,
Realice la lógica del código para que n subprocesos trabajen juntos para imprimir la secuencia de números naturales en orden: 1, 2, 3, ..., n.
Idea : varios hilos están girando y esperando si la tarea es su turno.
public class ThreadDemo {
//当前正在执行任务,全局可见
public static volatile char now;
public static void main(String[] args) {
//输入任务
char[] input = {'1','2','3','4','5'};
//每个线程要执行任务数
final int n = 1;
for (int j = 0; j < input.length; j++) {
final int t = j;
//开启线程任务
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < n; i++) {
//循环等待,自旋
while (now != input[t]) {}
System.out.print(input[t]);//处理任务
//修改当前执行任务的全局状态
if (t + 1 < input.length)
now = input[t + 1];
else
now = input[0];
}
}
});
thread.start();
}
//边界
now = input[0];
}
}
2. Escribe un algoritmo aleatorio de sobre rojo
Los requisitos de la asignatura son los siguientes:
Escribe un algoritmo aleatorio de sobre rojo. El requisito es: dar una cierta cantidad de dinero, un cierto número de personas, para garantizar que todos puedan obtener una cierta cantidad de dinero al azar.
Por ejemplo, por un sobre rojo de 100 yuanes, 10 personas lo agarraron y cada uno recibió algo de dinero. La restricción es que la cantidad de la mejor suerte no puede exceder el 90% de la cantidad máxima. Proporcione la implementación del código java.
Idea: tome un número aleatorio de la cantidad más grande y más pequeña, después de generar el número correspondiente, si hay más, acérquese a la línea promedio, si es menos, aumente un poco
import java.util.Random;
public class RedBagDemo {
//随机数种子
static Random random = new Random();
public static void main(String[] args) {
long[] result = generate(100, 10, 90, 1);
for (long l : result) {
System.out.println(l);
}
}
//放大取随机再缩小
static long xRandom(long min, long max) {
return sqrt(nextLong(sqr(max - min)));
}
//红包总额度,人数,红包最大金额,红包最小金额
public static long[] generate(long total, int count, long max, long min) {
long[] result = new long[count];
//取平均值,从平均值上加减
long average = total / count;
for (int i = 0; i < result.length; i++) {
//红包大了,往平均线上减
if (nextLong(min, max) > average) {
long temp = min + xRandom(min, average);
result[i] = temp;
total -= temp;
} else {
//红包小了,往平均线上减
long temp = max - xRandom(average, max);
result[i] = temp;
total -= temp;
}
}
// 余钱,给不超过最大额的人每个都加一块
while (total > 0) {
for (int i = 0; i < result.length; i++) {
if (total > 0 && result[i] < max) {
result[i]++;
total--;
}
}
}
// 如果总额小于0,按人头减1
while (total < 0) {
for (int i = 0; i < result.length; i++) {
if (total < 0 && result[i] > min) {
result[i]--;
total++;
}
}
}
return result;
}
//缩小
static long sqrt(long n) {
return (long) Math.sqrt(n);
}
//放大
static long sqr(long n) {
return n * n;
}
//下一个不超过n的随机数
static long nextLong(long n) {
return random.nextInt((int) n);
}
//下一个在min 和 max间的随机数
static long nextLong(long min, long max) {
return random.nextInt((int) (max - min + 1)) + min;
}
}
Wu Xie, Xiao San Ye, un pequeño novato en segundo plano, big data e inteligencia artificial. Presta atención a más