2016-06-14 5 views
-2

고유 한 임의의 정수를 만들 수있는 확실한 방법이 있습니다. 나는 고유 한 숫자로 Array 나 List를 만드는 법을 알고 있지만, 실제로 나는 시험과 같은 것을 만들 때마다 다른 시간마다 번호가 필요하며 db와는 다른 id-s 값을 취하고있다. 중복 번호를 받으면 시험에서 두 가지 동일한 질문을 할 것입니다.고유 한 임의의 정수를 만드는 방법은 무엇입니까?

할 방법이 없다면 무엇을 제안합니까? 문제를 다루는 방법. db에서 매번 다른 ID를 생성해야합니다. 미리 감사드립니다.

+0

고유해야 할 경우 임의이어서는 안됩니다. 당신은 처음부터 하나의 제약 조건을 넣었습니다. –

+0

물론 가능 합니다만, 그것은 매우 쉬운 알고리즘입니다. 이미 생성 된 숫자를 기억하고 새로운 것을 생성 할 때 이전에 생성되었는지 확인하십시오. 그렇다면 고유 한 것까지 새 것을 생성하고 확인하십시오. 그런 사소한 알고리즘에 문제가있는 곳은 어디입니까? –

+0

몇 개의 고유 번호를 만드십니까? – chungtinhlakho

답변

0

SQL에서는 이런 식으로 뭔가를 시도 할 수 있습니다 : 예를 들어, 파이썬에 내장 된 random.sample 위 내 코드에 해당합니다. 아래의 코드는 0에서 13까지 14 개의 고유 한 숫자를 제공하고 임시 테이블에 저장하며 어떤 것으로 써든 할 수 있습니다. SQL 서버에서 테스트하는 것은 2008

declare @randNumbers table (number int) 
declare @rand int, @howMany int 
set @howMany = 14 

set @rand = Ceiling(ABS(CHECKSUM(NewId())) % 25) 


while ((select COUNT(*) from @randNumbers)<10) 
begin 

    set @rand = Ceiling(ABS(CHECKSUM(NewId())) % @howMany) 

    BEGIN 
     IF NOT EXISTS (select * from @randNumbers 
         WHERE number = @rand) 

     BEGIN 
      insert into @randNumbers 
      values(@rand) 

     END 
    END 

end 

select * from @randNumbers 
+0

아래의 @bSkwared와 같은 알고리즘입니다. 나는 여전히 나쁜 선택이라고 생각한다. :-) – smarx

1

집합 S에서 N 개의 고유 난수 집합을 만들려면 먼저 부울 크기 | S | (세트의 카디널리티, 얼마나 많은 요소가 포함되어 있는지). 이제 임의의 숫자를 생성 할 때마다 배열의 숫자가 false인지 확인하고 true로 설정하고 그렇지 않으면 다른 숫자를 선택하십시오. 거짓 인덱스가있는 임의의 난수를 생성하여 다른 최종 배열에 추가 할 수 있습니다. 내가 질문을 다시 언급 할 수있는 경우

+1

나는 사람들에게 이런 종류의 알고리즘에 대해 경고 할 것이다. 여분의 공간이 필요하고 더 멀리 갈수록 속도가 느려지 며 종료가 보장되지 않습니다. (당신은 불행해질 때마다 같은 번호를 계속 선택할 수 있습니다.) – smarx

+0

1-N으로 배열을 초기화 한 다음 발견 된 각 색인을 제거하는 임의의 숫자 % arr.length를 선택하는 것이 좋습니다. – bSkwared

+0

그래, 그거야! – smarx

1

, 나는 당신이 찾고있는 생각 "어떻게 무작위로 미터에서 가능한 번호를 N 번호를 선택합니까?"

즉, 사용 가능한 숫자가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]이고 4를 선택하려는 경우 가능한 결과는 [8, 3, 5, 1]입니다.

몇 가지 방법이 있습니다. 가장 간단한 방법 중 하나는 초기 목록을 무작위 순서로 놓고 상단을 가져 오는 것입니다. n 요소. 파이썬에서 예를 들어

, 당신이 정말로 필요하지 않은 경우가 전체 목록을 무작위 때문에

>>> available = range(10) 
>>> random.shuffle(available) 
>>> available[:4] 
[5, 8, 6, 9] 

이 알고리즘은, 약간의 낭비입니다.

개선 사항은 한 번에 한 요소 씩 그 요소 다음에 임의의 위치로 교체하는 것입니다. 이를 Fisher-Yates shuffle이라고합니다. 그것은 의사 코드에 다음과 같습니다

-- To shuffle an array a of n elements (indices 0..n-1): 
for i from 0 to n−2 do 
    j ← random integer such that i ≤ j < n 
    exchange a[i] and a[j] 

하지만 그 대신 전체 목록을 거치지 만 N 당신이 선택해야하는 항목의 수이고, N 깊은 이동합니다.

import random 

def sample(items, how_many): 
    # copy the list 
    items = list(items) 

    # just do the first how_many items 
    for i in range(how_many): 
     random_index = random.randrange(i, len(items)) 

     # swap the items 
     items[i], items[random_index] = items[random_index], items[i] 

    # return the first how_many 
    return items[:how_many] 

print(sample(range(10), 4)) 

많은 언어/라이브러리가이 작업을 수행 할 수있는 기본 방법이 :

여기 파이썬 구현입니다.

>>> random.sample(range(10), 4) 
[1, 5, 0, 4] 
0

당신은 DB의 시퀀스를 생성하고 독특한 비 중복 자동 증가 번호를하는 데 사용할 수 있습니다 ...0000에서 9999 사이의 숫자를 말한 경우 (예 : ) 1.이 난수를 생성하는 메서드를 만듭니다. 2. 배열을 사용하여이 사용 된 번호를 저장하거나 데이터베이스에 저장합니다. 3. 다음 다른 번호를 생성 할 때 이미 번호를 사용했는지 확인하십시오. 4.이 전체 코드를 while 루프에 추가하여 무료 숫자를 얻을 때까지 새 코드를 생성하여 확인합니다.

관련 문제