Это смещение по модулю. Если RANDOM
составлен правильно, каждое значение от 0 до 32767 создается с равной вероятностью. Когда вы используете модуль, вы изменяете вероятности :вероятности всех значений выше модуля добавляются к значениям, которым они соответствуют.
В вашем примере 6×3600 составляет примерно две трети диапазона значений. Таким образом, вероятности верхней трети складываются с вероятностями нижней трети, а это означает, что значения от 0 до 2 (приблизительно )будут получены в два раза чаще, чем значения от 3 до 5. 9×3600 — это почти 32767, поэтому смещение по модулю намного меньше и влияет только на значения от 32400 до 32767.
Чтобы ответить на ваш главный вопрос, по крайней мере в Bash случайная последовательность полностью предсказуема, если вы знаете начальное число. См. intrand32
в variables.c
.
Используйте выражение jq
.[].results[] |.[0] as $name |.[1:] | map([.[]]? // [.]) |
(.[0]|keys[]) as $i | [ $name,.[][$i] ] | @csv
Первая строка здесь выбирает $name
в качестве первого элемента(.[0]
)из каждого отдельного подмассива -(abc025
и xyz025
соответственно в отдельных итерациях ), а затем преобразует оставшиеся данные в каждом sub -массив(.[1:]
)в массивы по одному массиву на столбец:
[["true"],["test.lun"]]
[["true","false","true"],["product.lun","app.lun","ora.lun"]]
Это делается в вызове map()
, где каждый элемент извлекается как массив. Если это не работает, элемент помещается в массив. Таким образом, каждый элемент либо остается массивом, либо преобразуется в массив из одного элемента.
Вторая строка перебирает индексы этих массивов столбцов и создает выходные данные в формате CSV.
Тестирование:
$ jq -r '.[].results[] |.[0] as $name |.[1:] | map([.[]]? // [.]) | (.[0]|keys[]) as $i | [ $name,.[][$i] ] | @csv' file
"abc025","true","test.lun"
"xyz025","true","product.lun"
"xyz025","false","app.lun"
"xyz025","true","ora.lun"
Обратите внимание, что это обобщение моего решения вашего предыдущего вопроса . Вы также можете использовать этот код со своими данными из этого вопроса.
Вы также можете использовать это для данных, содержащих более трех столбцов. Документ
[
{
"results": [
[ "abc025",
"true",
"test.lun",
"blueberry" ],
[ "xyz025",
["true","false","true"],
["product.lun","app.lun","ora.lun"],
["strawberry","cloudberry","lingonberry"] ]
]
}
]
превратится в
"abc025","true","test.lun","blueberry"
"xyz025","true","product.lun","strawberry"
"xyz025","false","app.lun","cloudberry"
"xyz025","true","ora.lun","lingonberry"