Массив сортировки Javascript с использованием дня месяца

Я хочу изменить порядок строки в зависимости от того, какой день месяца.

Например, произнесите слово «ПИЦЦА», 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");
Получение данных из формы с помощью JavaScript - краткое руководство
Получение данных из формы с помощью JavaScript - краткое руководство
Получить данные из формы с помощью JS очень просто: вы запрашиваете элемент формы, передаете его конструктору new FormData() и, наконец, получаете...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
1
0
35
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Math.random() возвращает число с плавающей точкой от 0 до 1, new Date().getDate() возвращает целое число от 1 до 31, поэтому, если вы хотите получить такое же поведение, вы должны разделить день месяца на 31.

Но обратите внимание, что этот генератор псевдослучайных чисел не очень хорош, и вы, вероятно, получите менее предсказуемые результаты с чем-то из вопрос о посеве генератора случайных чисел JS.

Что не так с Math.random()? Кроме того, что я не могу раздать его, я никогда ничего не слышал об этом плохой

J-Cake 10.04.2022 14:18

@ J-Cake, хорошо, вопрос в том, чтобы засеять RNG текущим днем ​​​​месяца, не так ли?

Samuel Olekšák 10.04.2022 14:22

Думал, вы имели в виду сам ГСЧ :/

J-Cake 10.04.2022 14:23

Да, поэтому мне по существу нужен 31 разный порядок массива

Sam 10.04.2022 14:23

Используя «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>

Другие вопросы по теме