|
|
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Есть необходимость генерить случайное и уникальное целое число. Как это можно реализовать, без просмотра всей таблицы перед вставкой очередного случайного значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2002, 20:02:28 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Какое же это случайное значение, если оно уже ограничено какими-то другими значениями ? Получается так - выбирите случайное число от 1 до 10 при условии, что значения 1,2,3,4,6,7,8,9 и 10 уже заняты ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2002, 20:36:37 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Нет. Суть в том, что нужно поле как с автоинкрементом, только значения в нем не должны бать последовательны. А генерятся ини из диапазона значений, заведомо превышающего максимально возможное количество записей в таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2002, 21:01:32 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Сгенерить случайное число можно с помощью cast(rand()*100000 as int). Генерить его можно в цикле, проверя сразу после генерации, нет ли совпадений с ранее сгенеренными. Если по этому полю постоен индекс, то работать должно вполне шустро. Вот только какая-то странная задача. Может вы объясните, зачем это нужно? Просто, есть подозрение, что вы на нее не с того фланга заходите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2002, 22:18:09 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Два варианта - используй GUID - почти случайное число - или создай специальную таблицу с несколькими полями и одной записью. В полях будет текущее значение id. В хранимой процедуре поля обновляются и гениерится новый id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2002, 22:50:01 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Конечная задача - это получение номера квитанции. Он естесственно должен быть уникален. Но если использовать просто автоинкремент, то легко вычислить количество квитанций за период (дата на ней тоже стоит). Этого нельзя допустить. Первая мысль генерить значение через random, а потом проверять, есть ли уже такое число в таблице. А база и так уже не быстра. Хочется избавиться от сканирования таблицы. Ведь чем дальше - тем больше вероятность повторения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2002, 23:22:31 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
День добрый! Если генерировать через random, то обязательно придется проверять. Поищите в классе шифрованных ключей. Например - автоинкремент , который преобразуется в текст и по алгоритму между позициями нечто вставлется (буквы алфавита, буквы фамилии клиента, даты заключения договора и т.п.). Т.е. процедуры шифрования и дешифрования, известные только Вам, а не клиенту. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2002, 09:21:59 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
- GUID - timestamp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2002, 10:31:41 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Если вы будете приводить к Bigint, умножая на диапазон всех его положительных чисел, то вероятность появления хотя бы одного повторного значения будет очень мало отличаться от нуля... Я думаю, что первое совпадение с ранее выпавшим случайным числом у Вас произойдет не раньше, чем лет через десять. А имея индекс по этому полю проверить if exists(.... where Number=@Number) можно очень шустро. Если я правильно понял, то частота подобных проверок соответствует частоте выписки квитанций. Вполне потянет и подобное решение. Я хотел и сам предложить GUID, но конкретно для данной задачи он очень неудобен в использовании. Представьте, что вы - оператор на телефоне. Вам звонит клиент с какой-то проблемой... Вы просите его назвать номер квитанции... А тпепрь записывайте, после каждого символа переспрашивая, что он имеет в виду (особенно, если он английские буквы в первый раз видит). Я бы на вашем месте генерил номер фиксированной длинны (например, из девяти цифр): cast(rand()*10000000000 as bigint), разбивая сгенерированный номер на триады (тысячи, миллиона, миллиарды) и разделяя их, к примеру черточками. Тогда общающиеся по телефону люди быстрои лекго смогут продиктовать и зафиксировать нужный номер. Кстати, для такого варианта вероятность совпадения с ранее сгенеренным номером равна 0.0000000001*(количество выданных ранее квитанций) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2002, 10:32:00 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Для ускорения (избавляемся от явных циклов) и простоты использования можно как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2002, 10:39:26 |
|
||
|
Генерация случайного уникального значения
|
|||
|---|---|---|---|
|
#18+
Каждый следующий ID расчитавай как предыдущий + некоторое случайное значение в заданном интервале. PS : bigint - хватит на долго select @NewID = max(ID) + cast(rand()*100 as int) from ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2002, 11:07:53 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32059430&tid=1819496]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
24ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 317ms |

| 0 / 0 |
