Найти местоположение НОВОГО номера в списке

Я ищу способ найти, где находится число RAND() в списке иррациональных (фактически RAND()) чисел от 0 до 1.

Итак, у меня есть список чисел 0,1003, 0,1984, 0,3895, 0,4506, 0,4724, 0,4856, 0,5602, 0,8542 в A1:A8

Затем у меня есть RAND() число, которое нужно сверить со списком. Теперь я попробовал RANK.AV(RAND(),A1:A8), но функции ранжирования требуют, чтобы ваше значение поиска было в списке.

Простым решением было бы поместить мой RAND() в конец списка (A9) и использовать RANK.AV(A9,A1:A9), чтобы мой номер был включен в список, однако мне пришлось бы делать это для каждого номера в моем списке. массив из тысяч случайных чисел, поэтому непрактичный.

Возможно, есть способ присоединить другую ячейку к массиву, фактически не помещая ее рядом?

Например, для RAND() в B1 я мог бы написать в C1:

=RANK.AV(B1,ARRAY.JOIN(A1:A8,B1)), но я пробовал несколько способов (&,+) и не могу добиться этой функции объединения массивов, поэтому я решил обратиться за помощью! Возможно, требуется макрос или UDF?


person Greedo    schedule 27.09.2016    source источник
comment
Если ваш список отсортирован (как и ваш образец), вы можете использовать Match с последним параметром True, чтобы получить позицию вашего тестового значения.   -  person chris neilsen    schedule 27.09.2016
comment
Я почти уверен, что вам понадобится немного VBA, чтобы вставить новый номер в список и переместить те, которые следуют за ним, на одно место.   -  person Tom Sharpe    schedule 27.09.2016
comment
Приносим извинения за плохую формулировку; На самом деле мне не нужно помещать значение RAND() в список, только чтобы найти, где (в числовом выражении) его место в списке. Я немного подредактировал формулировку   -  person Greedo    schedule 27.09.2016
comment
В этом случае см. комментарий @Chris Neilsen: Match даст вам позицию элемента непосредственно перед вашим новым случайным числом, которому вы даете ранг. Кажется справедливым позволить ему дать это в качестве ответа, если он этого хочет.   -  person Tom Sharpe    schedule 27.09.2016
comment
Кстати, связи с реальными числами крайне маловероятны, если rand() основан на приличном алгоритме, но вы можете закодировать его, если хотите быть уверенным.   -  person Tom Sharpe    schedule 27.09.2016


Ответы (2)


Извините, @Chris, я уверен, что это то, что вы имели в виду в своем комментарии: -

=IF(B1<A1,1,MATCH(B1,$A$1:$A$10)+1)

где ваш новый случайный номер находится в B1, а ваш существующий список в A1: A10, отсортированный в порядке возрастания. Если новое число меньше, чем первая запись в списке, это будет особый случай: в противном случае вы могли бы учесть это, поместив ноль в A1 и переместив псевдослучайные числа вниз, что упростило бы формулу до

=MATCH(B1,A$1:A$10)

введите здесь описание изображения

Если вы хотите разрешить галстуки, вы можете исправить это: -

=IF(B1<A1,1,MATCH(B1,$A$1:$A$10)+1)-COUNTIF($A$1:$A$10,B1)/2

или просто

=MATCH(B1,$A$1:$A$10)-COUNTIF($A$1:$A$10,B1)/2

с нулем в A1.

Я предполагаю, что ранжирование от 1 = наименьшее до 8 = наибольшее, если есть 8 чисел: вы можете легко изменить его, вычитая ранг из количества (A $ 1: A $ 10) + 2 или количества (A $ 1: A $ 10) +1, если ноль включен.

person Tom Sharpe    schedule 27.09.2016
comment
да, Том, это то, что я имел в виду. Возможно, стоит добавить требование о сортировке диапазона поиска. - person chris neilsen; 27.09.2016
comment
Спасибо - немного приукрасил мой ответ. - person Tom Sharpe; 28.09.2016

Это может сделать ваш трюк:

=RANK.AVG(INDEX(A1:A8,RANDBETWEEN(1,COUNT(A1:A8))),A1:A8)

Это ранжирует случайный выбор из случайных чисел.

person zipa    schedule 27.09.2016
comment
Почти, но не совсем; ваш подход выбирает случайное число из списка, придавая всем числам равный вес. Однако мой список расположен неравномерно, поэтому шансы оказаться между двумя числами, расположенными далеко друг от друга, должны быть пропорционально выше, чем между двумя числами, расположенными гораздо ближе друг к другу. Это необходимо для моих целей, и этот подход упускает из виду. - person Greedo; 27.09.2016
comment
Если я вас правильно понял, это может быть вашим решением =RANK.AVG(VLOOKUP(RAND(),A1:A8,1,TRUE),A1:A8). И это в основном то же самое, что и случайное число действует как число в списке. - person zipa; 27.09.2016
comment
На самом деле, я пропустил случаи, когда число больше, чем max или меньше, чем min, делая правильную формулу, например: =IFERROR(RANK.AVG(VLOOKUP(B1,A1:A8,1,TRUE),A1:A8),IF(B1>MAX(A1:A8),1,COUNT(A1:A8)+1)). Я надеюсь, что это тот, который вам нужен. - person zipa; 27.09.2016