Я хочу изменить порядок строки в зависимости от того, какой день месяца.
Например, произнесите слово «ПИЦЦА», 1 мая это будет «ZZSIPA», а 2 мая это будет «APIZZS» и т. д.
Код, который я запускаю, работает для Math.random(), однако, когда я присваиваю ему значение дня месяца, оно не меняется.
const dayOfMonth = new Date().getDate();
function shuffle(s) {
var arr = s.split('');
for (let i = arr.length -1; i > 0; i--) {
let j = Math.floor(dayOfMonth * i)
let k = arr[i]
arr[i] = arr[j]
arr[j] = k
}
s = arr.join('');
return s; // Return shuffled string
}
var s = shuffle("PIZZAS");
Math.random()
возвращает число с плавающей точкой от 0 до 1, new Date().getDate()
возвращает целое число от 1 до 31, поэтому, если вы хотите получить такое же поведение, вы должны разделить день месяца на 31.
Но обратите внимание, что этот генератор псевдослучайных чисел не очень хорош, и вы, вероятно, получите менее предсказуемые результаты с чем-то из вопрос о посеве генератора случайных чисел JS.
@ J-Cake, хорошо, вопрос в том, чтобы засеять RNG текущим днем месяца, не так ли?
Думал, вы имели в виду сам ГСЧ :/
Да, поэтому мне по существу нужен 31 разный порядок массива
Используя «Math.sin(dayOfMonth++) * 10000», проблема решена.
var dayOfMonth = new Date().getDate();
function random() {
var x = Math.sin(dayOfMonth++) * 10000;
return x - Math.floor(x);
}
function shuffle(s) {
var arr = s.split('');
for (let i = arr.length -1; i > 0; i--) {
let j = Math.floor(random() * i)
let k = arr[i]
arr[i] = arr[j]
arr[j] = k
}
s = arr.join('');
return s; // Return shuffled string
}
var s = shuffle("PIZZAS");
Ваша перетасовка не удалась, потому что вы меняете undefined.
Я отладил ваш код, реализация функции shuffle(s)
осталась неизменной.
А shuffle_new(s)
решит проблему замены undefined с помощью модульный оператор: let j = Math.floor(dayOfMonth * i) % arr.length
, чтобы arr[j]
никогда не возвращал значение undefined.
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta http-equiv = "X-UA-Compatible" content = "IE=edge">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Shuffle Demo</title>
</head>
<body>
<script>
const writeln = (text = '') => document.writeln(text + '<br/>');
</script>
<script>
const dayOfMonth = new Date().getDate();
function shuffle(s) {
var arr = s.split('');
for (let i = arr.length - 1; i >= 0; i--) {
writeln();
let j = Math.floor(dayOfMonth * i)
writeln('j:' + j);
let k = arr[i]
writeln('k:' + k);
arr[i] = arr[j]
writeln('arr[j]:' + arr[j]);
arr[j] = k
writeln('arr:' + arr);
}
s = arr.join('');
return s; // Return shuffled string
}
function shuffle_new(s) {
var arr = s.split('');
for (let i = arr.length - 1; i >= 0; i--) {
writeln();
let j = Math.floor(dayOfMonth * i) % arr.length
writeln('j:' + j);
let k = arr[i]
writeln('k:' + k);
arr[i] = arr[j]
writeln('arr[j]:' + arr[j]);
arr[j] = k
writeln('arr:' + arr);
}
s = arr.join('');
return s; // Return shuffled string
}
writeln('dayOfMonth:' + dayOfMonth);
writeln('process: shuffle("PIZZAS")');
var s = shuffle("PIZZAS");
writeln('output:' + s);
writeln();
writeln();
writeln();
writeln();
writeln('process: shuffle_new("PIZZAS")');
var s = shuffle_new("PIZZAS");
writeln('output:' + s);
</script>
</body>
</html>
Что не так с
Math.random()
? Кроме того, что я не могу раздать его, я никогда ничего не слышал об этом плохой