Поиск:

Ответ в темуСоздание новой темы Создание опроса
> случайное число из заданного множества 
:(
    Опции темы
Alx
Дата 17.3.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



собственно задача такая - выбрать из массива случайный элемент (ручками).

раньше пользовался round(random()*n) (где n - длина массива)
но заметил, что 0 и n выпадают в 2 раза реже, чем остальные варианты. это, конечно, никуда не годится.

есть ли у кого-нибудь другие варианты?


--------------------
PM MAIL WWW ICQ   Вверх
cardinal
Дата 17.3.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Вот тут то, что получилось однажды после долгой дискуссии
VB-VB-002236


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Alx
Дата 17.3.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



не очень понял... можт, неправильно перевёл?

Код

function rand(min,max)
{   if (min == max)
        return false;
    if (min > max)
    {   min = max;
        max = rand() // << ??? ( Max = Random )
    }
return ((Math.round() * (max - min + 1)) ??? (max - min + 1) + min); // че за Mod ?
}

Добавлено @ 19:37
Код

Public Function Random(Min As Long, Max As Long) As Long
 Random = Min
 If Min = Max Then Exit Function
 If Min > Max Then
    Min = Max
    Max = Random
 End If
 Random = (Rnd * (Max - Min + 1)) Mod (Max - Min + 1) + Min
End Function



--------------------
PM MAIL WWW ICQ   Вверх
Akina
Дата 17.3.2006, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Alx @ 17.3.2006, 20:37 Найти цитируемый пост)
можт, неправильно перевёл?

адназначна

Код

Random = Min
'...
Max = Random

Имя функции одновременно является именем переменной, в которой возвращается значение. Смысл - если min больше max, их надо просто поменять местами.

MOD - получение остатка от целочисленного деления.

Итого (проверь)
Код

function rand(min,max)
{   if (min == max)
        return min;
    if (min > max)
       swap(min,max);
return ((Math.round() * (max - min + 1)) % (max - min + 1) + min);
}





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Alx
Дата 17.3.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



ну вот, наконец-то.
в результате всего, min и max-1 все равно встречаются в два раза реже, чем все что между ними...(


--------------------
PM MAIL WWW ICQ   Вверх
Alx
Дата 18.3.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



чуть-чуть модифицировал.

Код

function rand(mn,mx)
{   var rnd = Math.random();
    var min = (mx ? (mn || 0) : 0);
    var max = mx-1 || (mn ? mn-1 : 0);
    if (max == 0) return rnd;
    return ((rnd * (max - min + 1)) % (max - min + 1) + min);
}


теперь можно вызывать 3-мя способами:

Код

rand() // возвращает Math.random() , число от 0 до 1
rand(max) // возвращает дробное число от 0 до max (вкл.)
rand(min,max) // возвращает дробное число от min до max (вкл.)

Добавлено @ 00:10
собственно говоря, никакого решения проблемы я не вижу. в этой функции только добавилась фича задавать результаты не от нуля до n_max, а от n_min до n_max. попрежнему же, если округлять до целых чисел результаты функции rand(5,10) , то чисел 5 и 10 будет в 2раза меньше, чем остальных!


--------------------
PM MAIL WWW ICQ   Вверх
cardinal
Дата 18.3.2006, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Alx @ 17.3.2006, 20:24 Найти цитируемый пост)
в результате всего, min и max-1 все равно встречаются в два раза реже, чем все что между ними...(

Я сейчас на скорую руку проверил и получил для
Код

Option Explicit

Private Sub Command1_Click()
Dim i As Long
Dim x(100) As Integer
Dim a As Integer
For i = 0 To 100000
a = Random(20, 60)
x(a) = x(a) + 1
Next
For i = 20 To 60
Debug.Print x(i)
Next
End Sub
Public Function Random(Min As Long, Max As Long) As Long
 Random = Min
 If Min = Max Then Exit Function
 If Min > Max Then
    Min = Max
    Max = Random
 End If
 Random = (Rnd * (Max - Min + 1)) Mod (Max - Min + 1) + Min
End Function

следущее:

2448
2534
2422
2420
2359
2407
2378
2503
2324
2520
2454
2428
2410
2393
2466
2399
2481
2485
2448
2461
2413
2432
2509
2372
2511
2466
2397
2499
2462
2445
2392
2464
2401
2476
2403
2427
2437
2461
2430
2445
2419

То есть все ИМХО в норме...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Alx
Дата 18.3.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



cardinal,
посуди сам. есть рандомное число, которое возвращает Math.random().
умножаем его на 10 (max) получаем числа от 0 до 10. затем округляем.
но что бы после округления получить 0, то начальное число должно быть < 0.5, а 10 - > 9.5.
то есть по промежутку на 1/2. зато другие числа до округления принадлежат в 2 раза большим промежуткам:
3 - 2.5 - 3.5
4 - 3.5 - 4.5
9 - 8.5 - 9.5

я предлагаю объеденить 1 и последний набор. вот что у меня получилось после 4 запусков rand(10) и округления результатов:

Цитата

0 => 78, 101, 97, 86
1 => 88, 84, 67, 101
2 => 96, 99, 111, 103
3 => 86, 84, 101, 85
4 => 90, 101, 91, 103
5 => 102, 94, 98, 84
6 => 92, 72, 90, 89
7 => 102, 102, 101, 91
8 => 91, 85, 82, 64
9 => 87, 89, 82, 95
10 => 88, 89, 80, 99


вот новый вариант функции:

Код

function rand(mn,mx)
{   var rnd = Math.random();
    var min = (mx ? (mn || 0) : 0);
    var max = mx || (mn ? mn : 0);
    if (max == 0) return rnd;
    var rrand = (rnd * (max - min + 1)) % (max - min + 1) + min;
    return (rrand < max+0.5) ? rrand : rrand - max + min - 0.5;
}



--------------------
PM MAIL WWW ICQ   Вверх
esperant0
Дата 18.3.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Вместо округления используйте ф-ию взятия целой части


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Alx
Дата 18.3.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



esperant0,
зачем? smile


--------------------
PM MAIL WWW ICQ   Вверх
esperant0
Дата 18.3.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(Alx @ 18.3.2006, 14:13)
esperant0,
зачем? smile

затем что тогда 0 получиться если сгенирируется число от 0 до 0.99999
1 1.0000 до 1.999999

и т.п.


Т.е все числа сгенерируются с одинаковой вероятностью


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
cardinal
Дата 18.3.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Alx @ 18.3.2006, 09:19 Найти цитируемый пост)
то есть по промежутку на 1/2. зато другие числа до округления принадлежат в 2 раза большим промежуткам

Твоя аргументация ясна, но на практике я вижу совсем другой результат. Вот еще раз вероятности для чисел от 0 до 9 (1000000 чисел):

0,100282
0,099858
0,099588
0,100246
0,100377
0,099935
0,099612
0,099968
0,100166
0,099969

Посмотрев на них я могу сказать, что все чики поки и ты не прав. smile

Вот код:
Код

Option Explicit

Private Sub Command1_Click()
Dim i As Long
Dim x(100) As Long
Dim a As Long
For i = 0 To 1000000
a = Random(0, 9)
x(a) = x(a) + 1
Next
For i = 0 To 9
Debug.Print x(i) / 1000000
Next
End Sub
Public Function Random(Min As Long, Max As Long) As Long
 Random = Min
 If Min = Max Then Exit Function
 If Min > Max Then
    Min = Max
    Max = Random
 End If
 Random = (Rnd * (Max - Min + 1)) Mod (Max - Min + 1) + Min
End Function



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.