Sub Rnd_40mega() Const nMin& = 1 Const nMax& = 10 Dim iVal Randomize With CreateObject("Scripting.Dictionary") Do While .Count < (nMax - nMin + 1) iVal = .Item(Int((nMax - nMin + 1) * Rnd + nMin&)) 'если обращаемся к словарю по не существующему ключу, то создаётся запись с этим ключом Loop ActiveCell.Resize(UBound(.Keys) + 1).Value = Application.WorksheetFunction.Transpose(.Keys) End With End Sub
[/vba]
А проще так: [vba]
Код
Sub Rnd_40mega() Const nMin& = 1 Const nMax& = 10 Dim iVal Randomize With CreateObject("Scripting.Dictionary") Do While .Count < (nMax - nMin + 1) iVal = .Item(Int((nMax - nMin + 1) * Rnd + nMin&)) 'если обращаемся к словарю по не существующему ключу, то создаётся запись с этим ключом Loop ActiveCell.Resize(UBound(.Keys) + 1).Value = Application.WorksheetFunction.Transpose(.Keys) End With End Sub
А1:А10 цифры 1 до 10 расположить в случайном порядке
я как-то слабо представляю решение формулой... Конечно, я в формулах только по поверхности плаваю (как что-то в проруби ), но здесь, кажется, в любом случае без UDF не обойтись.
0mega, а если вместо Sub в коде будет написано Function, то вам, конечно же станет намного легче? :p
А вообще-то, при такой постановке задачи:
Quote (0mega)
А1:А10 цифры 1 до 10 расположить в случайном порядке
я как-то слабо представляю решение формулой... Конечно, я в формулах только по поверхности плаваю (как что-то в проруби ), но здесь, кажется, в любом случае без UDF не обойтись.
0mega, а если вместо Sub в коде будет написано Function, то вам, конечно же станет намного легче? :p
Ну, решение формулами, конечно, красивое, но не совсем корректное.
Quote (Справка Ёкселя)
Функция СЛЧИС возвращает равномерно распределенное случайное число, большее либо равное 0 и меньшее 1
Т.е. никто не гарантирует, что при достаточно большом числе попыток функция СЛЧИС выдаст два одинаковых числа. Ведь ей это не запрещено. К тому же разрядность чисел Ёкселя ограничена... Ну, а из этого
Quote (Справка Ёкселя)
Функция РАНГ присваивает повторяющимся числам одинаковый ранг
следует, что вероятность повтора будет ещё выше. (не 1 раз на 10 миллионов попыток, а 1 раз на 5 миллионов! ) Предлагаемая же UDF будет крутить цикл до тех пор, пока не заполнит словарь только уникальными числами.
Ну, решение формулами, конечно, красивое, но не совсем корректное.
Quote (Справка Ёкселя)
Функция СЛЧИС возвращает равномерно распределенное случайное число, большее либо равное 0 и меньшее 1
Т.е. никто не гарантирует, что при достаточно большом числе попыток функция СЛЧИС выдаст два одинаковых числа. Ведь ей это не запрещено. К тому же разрядность чисел Ёкселя ограничена... Ну, а из этого
Quote (Справка Ёкселя)
Функция РАНГ присваивает повторяющимся числам одинаковый ранг
следует, что вероятность повтора будет ещё выше. (не 1 раз на 10 миллионов попыток, а 1 раз на 5 миллионов! ) Предлагаемая же UDF будет крутить цикл до тех пор, пока не заполнит словарь только уникальными числами.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 21.10.2010, 15:26
Ну, решение формулами, конечно, красивое, но не совсем корректное.
А кто-то прорубь вспоминал ...
Quote (Alex_ST)
...по поверхности плаваю (как что-то в проруби... )
Алексей, Даже если 1 раз на 100 000 выпадут два одинаковых значения то меня вполне устраивает это решение .
Quote (Alex_ST)
UDF будет крутить цикл до тех пор, пока не заполнит словарь только уникальными числами.
Кто-бы спорил, я не буду. Но на сегодняшний день если выбирать между N=∞ и N=5*10^6 , то я выберу последнее, потому что там префикс "=" . Этот знак я могу заставить мне подчиниться. А у "бесконечности" в голове стоит "Sub" . И здесь получается полная противоположность. У меня 100%-ая зависимость от Sub-a
Alex_ST,
Quote (Alex_ST)
Ну, решение формулами, конечно, красивое, но не совсем корректное.
А кто-то прорубь вспоминал ...
Quote (Alex_ST)
...по поверхности плаваю (как что-то в проруби... )
Алексей, Даже если 1 раз на 100 000 выпадут два одинаковых значения то меня вполне устраивает это решение .
Quote (Alex_ST)
UDF будет крутить цикл до тех пор, пока не заполнит словарь только уникальными числами.
Кто-бы спорил, я не буду. Но на сегодняшний день если выбирать между N=∞ и N=5*10^6 , то я выберу последнее, потому что там префикс "=" . Этот знак я могу заставить мне подчиниться. А у "бесконечности" в голове стоит "Sub" . И здесь получается полная противоположность. У меня 100%-ая зависимость от Sub-a0mega
Сообщение отредактировал 0mega - Четверг, 21.10.2010, 17:16
Serge_007, что-то кругом народ массово откатывается на 2003-й Да я и сам в прошлом году посмотрел НА ЧУЖОМ КОМПЕ 2007-й офис, мышкой потыкался, сказал "ну его нафиг" и с удовольствием вернулся к своему компу с ХРюшей и 2003-им офисом.
Serge_007, что-то кругом народ массово откатывается на 2003-й Да я и сам в прошлом году посмотрел НА ЧУЖОМ КОМПЕ 2007-й офис, мышкой потыкался, сказал "ну его нафиг" и с удовольствием вернулся к своему компу с ХРюшей и 2003-им офисом. Alex_ST
это достаточно быстро считается формулой когда значений не тысячи
Тер.Вер. я , к счастью, проходил только в институте, поэтому, естественно, посчитать вероятность попадания двух одинаковых 15-разрядных чисел в равномерную выборку из, например, 1000 значений не могу... Но всё равно, я думаю, что она (в смысле вероятность) пренебрежимо мала для реальных условий. Ну, в смысле к тому времени, как выпадет наконец два одинаковых значения, скорее всего файл уже станет никому не нужен, т.к. под Windows-2050 Ёксель-2003 уж наверняка работать не будет
могу только повторить:
Quote (Alex_ST)
это достаточно быстро считается формулой когда значений не тысячи
Тер.Вер. я , к счастью, проходил только в институте, поэтому, естественно, посчитать вероятность попадания двух одинаковых 15-разрядных чисел в равномерную выборку из, например, 1000 значений не могу... Но всё равно, я думаю, что она (в смысле вероятность) пренебрежимо мала для реальных условий. Ну, в смысле к тому времени, как выпадет наконец два одинаковых значения, скорее всего файл уже станет никому не нужен, т.к. под Windows-2050 Ёксель-2003 уж наверняка работать не будет Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 22.10.2010, 12:08
под Windows-2050 Ёксель-2003 уж наверняка работать не будет
Алексей, я так думаю что на 50-х ставнях уже будет не 2003-й, а 2030 (как минимум) и тогда можно будет воспользоваться функцией =СЛУЧУНИКАЛЬНОЕ(диапазон;шаг)
Quote (Alex_ST)
под Windows-2050 Ёксель-2003 уж наверняка работать не будет
Алексей, я так думаю что на 50-х ставнях уже будет не 2003-й, а 2030 (как минимум) и тогда можно будет воспользоваться функцией =СЛУЧУНИКАЛЬНОЕ(диапазон;шаг)0mega
_Boroda_, здравствуйте. Вo-первых: спасибо за решение. Честно говоря - формула для меня "тяжелая" и не понятная, но это уже вопрос пятый Во-вторых: на этом форуме нет необходимости сжимать файлы. "живой" excel здесь прекрасно грузится P.S. to admin наградите плюсиком автора ответа я с этой капчей до пенсии не доживу... допускаю, что я слепой. но пусть зрячие скажут какой здесь код
_Boroda_, здравствуйте. Вo-первых: спасибо за решение. Честно говоря - формула для меня "тяжелая" и не понятная, но это уже вопрос пятый Во-вторых: на этом форуме нет необходимости сжимать файлы. "живой" excel здесь прекрасно грузится P.S. to admin наградите плюсиком автора ответа я с этой капчей до пенсии не доживу... допускаю, что я слепой. но пусть зрячие скажут какой здесь код0mega