在给定条件下生成特定范围内的随机数 javascript - 次 table
Generate random numbers within specific range and with given conditions in javascript - times table
我已经为每个单独的乘数(从 2 到 10 的数字)生成了一组随机数字(生成的数字)。
代码本身确实生成了数字,尽管不是预期的那样。
当前行为:
- 它在数组(例如 2x4 和 2x4)中呈现数字(有时是重复的)
- 每次渲染不同长度的数组
- 渲染的数字乘法值是重复的(如果有 4x7 和 7x4 的对象,它应该用新值替换其中一组)
- 数字对象在给定条件下呈现(例如数字 9 乘数将呈现至少一次但不超过 3 次)
预期行为:
- 它为每个乘数呈现一组唯一的数字
- 始终呈现相同长度的数组(长度 === 18)
- 检查乘数与生成数字的乘积是否与数组中的值相匹配,如果匹配则呈现另一组数字(仍在条件范围内)
这是我目前得到的结果
const randomNumbersGenerator = () => {
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
const number2 = getRandomInt(0, 2);
const number3 = getRandomInt(0, 3);
const number4 = getRandomInt(0, 3);
const number5 = getRandomInt(0, 3);
const number6 = getRandomInt(1, 4);
const number7 = getRandomInt(1, 4);
const number8 = getRandomInt(1, 4);
const number9 = getRandomInt(1, 4);
const number10 = getRandomInt(0, 2);
const number11 = getRandomInt(0, 3);
const randomNumber = () => getRandomInt(2, 12);
let current;
const numbersArray = [];
for (let i = 0; i < number2; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 2,
generated: current
});
}
}
for (let i = 0; i < number3; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 3,
generated: current
});
}
}
for (let i = 0; i < number4; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 4,
generated: current
});
}
}
for (let i = 0; i < number5; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 5,
generated: current
});
}
}
for (let i = 0; i < number6; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 6,
generated: current
});
}
}
for (let i = 0; i < number7; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 7,
generated: current
});
}
}
for (let i = 0; i < number8; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 8,
generated: current
});
}
}
for (let i = 0; i < number9; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 9,
generated: current
});
}
}
for (let i = 0; i < number10; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 10,
generated: current
});
}
}
for (let i = 0; i < number11; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 11,
generated: current
});
}
}
console.log(numbersArray);
return numbersArray;
};
randomNumbersGenerator();
您也可以通过codeSandbox查看:
https://codesandbox.io/s/upbeat-jang-coqd5?file=/src/index.js:660-672
我想这就是您要找的。我采取了完全不同的方法。
首先,我使用 Map 因为它很容易确保唯一性。 (键必须是唯一的)
请注意,我使用一个简单的字符串作为密钥以确保它们是唯一的(使用对象会有点复杂)
ranges
数组表示您的“number2、number3”等
循环从 2
开始以满足您的乘数范围 (2 - 11)。这需要一些技巧才能正确获得折射率锥。
这会生成唯一的对(作为键),映射的值是生成的值和乘数相乘。
尺寸和地图打印在控制台。
const randomNumbersGenerator = () => {
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
const randomNumber = () => getRandomInt(2, 12);
const multiplierMap = new Map();
const ranges = [[0, 2], [0, 3], [0, 3], [0, 3], [0, 3], [1, 4], [1, 4], [1, 4], [1, 4], [0, 2], [0, 3]];
while(multiplierMap.size < 17) {
for (let i = 2; i < ranges.length+1; i++) {
const randomInt = randomNumber();
if(Array.from(multiplierMap.values).includes(randomInt * i)){
--i;
} else {
multiplierMap.set(randomInt + " " + i, randomInt * i);
}
if(multiplierMap.size === 18) break;
}
}
console.log('MultiplierMap size: ', multiplierMap.size);
for(let [pair, multiple] of multiplierMap){
console.log('Generated Multiplier: ' + pair, '||', 'Generated * Multiplier: ' + multiple);
}
return multiplierMap;
};
randomNumbersGenerator();
我已经为每个单独的乘数(从 2 到 10 的数字)生成了一组随机数字(生成的数字)。
代码本身确实生成了数字,尽管不是预期的那样。
当前行为:
- 它在数组(例如 2x4 和 2x4)中呈现数字(有时是重复的)
- 每次渲染不同长度的数组
- 渲染的数字乘法值是重复的(如果有 4x7 和 7x4 的对象,它应该用新值替换其中一组)
- 数字对象在给定条件下呈现(例如数字 9 乘数将呈现至少一次但不超过 3 次)
预期行为:
- 它为每个乘数呈现一组唯一的数字
- 始终呈现相同长度的数组(长度 === 18)
- 检查乘数与生成数字的乘积是否与数组中的值相匹配,如果匹配则呈现另一组数字(仍在条件范围内)
这是我目前得到的结果
const randomNumbersGenerator = () => {
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
const number2 = getRandomInt(0, 2);
const number3 = getRandomInt(0, 3);
const number4 = getRandomInt(0, 3);
const number5 = getRandomInt(0, 3);
const number6 = getRandomInt(1, 4);
const number7 = getRandomInt(1, 4);
const number8 = getRandomInt(1, 4);
const number9 = getRandomInt(1, 4);
const number10 = getRandomInt(0, 2);
const number11 = getRandomInt(0, 3);
const randomNumber = () => getRandomInt(2, 12);
let current;
const numbersArray = [];
for (let i = 0; i < number2; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 2,
generated: current
});
}
}
for (let i = 0; i < number3; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 3,
generated: current
});
}
}
for (let i = 0; i < number4; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 4,
generated: current
});
}
}
for (let i = 0; i < number5; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 5,
generated: current
});
}
}
for (let i = 0; i < number6; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 6,
generated: current
});
}
}
for (let i = 0; i < number7; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 7,
generated: current
});
}
}
for (let i = 0; i < number8; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 8,
generated: current
});
}
}
for (let i = 0; i < number9; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 9,
generated: current
});
}
}
for (let i = 0; i < number10; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 10,
generated: current
});
}
}
for (let i = 0; i < number11; i += 1) {
if (numbersArray.indexOf((current = randomNumber())) === -1) {
numbersArray.push({
multiplier: 11,
generated: current
});
}
}
console.log(numbersArray);
return numbersArray;
};
randomNumbersGenerator();
您也可以通过codeSandbox查看: https://codesandbox.io/s/upbeat-jang-coqd5?file=/src/index.js:660-672
我想这就是您要找的。我采取了完全不同的方法。
首先,我使用 Map 因为它很容易确保唯一性。 (键必须是唯一的)
请注意,我使用一个简单的字符串作为密钥以确保它们是唯一的(使用对象会有点复杂)
ranges
数组表示您的“number2、number3”等
循环从 2
开始以满足您的乘数范围 (2 - 11)。这需要一些技巧才能正确获得折射率锥。
这会生成唯一的对(作为键),映射的值是生成的值和乘数相乘。
尺寸和地图打印在控制台。
const randomNumbersGenerator = () => {
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
const randomNumber = () => getRandomInt(2, 12);
const multiplierMap = new Map();
const ranges = [[0, 2], [0, 3], [0, 3], [0, 3], [0, 3], [1, 4], [1, 4], [1, 4], [1, 4], [0, 2], [0, 3]];
while(multiplierMap.size < 17) {
for (let i = 2; i < ranges.length+1; i++) {
const randomInt = randomNumber();
if(Array.from(multiplierMap.values).includes(randomInt * i)){
--i;
} else {
multiplierMap.set(randomInt + " " + i, randomInt * i);
}
if(multiplierMap.size === 18) break;
}
}
console.log('MultiplierMap size: ', multiplierMap.size);
for(let [pair, multiple] of multiplierMap){
console.log('Generated Multiplier: ' + pair, '||', 'Generated * Multiplier: ' + multiple);
}
return multiplierMap;
};
randomNumbersGenerator();