2013-07-18 3 views
0

quize app을하고 있습니다. 이 애플 리케이션 질문에 중복이 생성되지 않을 수 있습니다. 그래서 int value = random.nextInt (10-1) + 1.When과 같은 코드를 사용하고 있습니다. 응답 난수를 새로 생성 할 것이므로 duplicates.How를 생성 할 때마다 이전의 무작위 값을 매번 새로운 무작위 값과 비교할 수 있습니까?복제하지 않고 단일 무작위 값을 생성하는 방법?

+1

http://stackoverflow.com/questions/5224877/java-generate-random-range-of-specific-numbers-without-duplication-of-those-nu I입니다 이 링크가 도움이 될 것이라고 생각하십시오 – Ramz

답변

2

값을 해시 맵에 저장 한 다음 값이 이미 있는지 확인하십시오. 거기에 다시 올리면.

+0

HashMap에 저장하고 검사하는 것이 현명한 방법입니다. 그러나 이것은 실패 할 때마다 HashMap에 복제물을 추가하려고 할 때마다 새로운 충돌을 다시 생성해야하기 때문에 더 많은 충돌을 야기 할 수 있습니다. 그러나 한꺼번에 모든 것을 생성하고 뒤죽박죽이되어서는 안됩니다. 그러나 입력 집합이 작기 때문에이 충돌은 너무 많이 발생하지 않을 수 있습니다 (임의성에 따라 또는 너무 많이 발생하는 경우 ??) 및 비교를 위해지도 요소에 대한 O (1) 액세스가 도움이됩니다. – Slartibartfast

+0

Shuffle은 아마도 가장 좋은 방법 일 것입니다. 저는 문제를 해결할 수있는 빠른 방법을 생각했습니다. – Warpzit

3
  1. 보관할 목록에서 제거 생성 된 번호 목록을 임의 재생 목록

  2. 1에서 10을 저장소에 생성

    List<Integer> list = new LinkedList<Integer>();

    for (int i = 1; i <= 10; i++) { 
        list.add(i) 
    } 
    
    Collections.shuffle(list); 
    
    int value= list.remove(0); 
    ....... 
    
    value= list.remove(0); 
    

및 그래서 ...

다음을 확인하십시오 : Java - generate Random range of specific numbers without duplication of those numbers - how to?

또한 HashMap에 저장하고 검사하는 것이 다른 답변과 똑같은 방법입니다. 그러나 이것은 실패 할 때마다 HashMap에 복제물을 추가하려고 할 때마다 새로운 충돌을 다시 생성해야하기 때문에 더 많은 충돌을 야기 할 수 있습니다. 그러나 한꺼번에 모든 것을 생성하고 뒤죽박죽이되어서는 안됩니다. 그러나 입력 집합이 작기 때문에 (10)이 충돌은 너무 많이 발생하지 않을 수 있습니다 (임의성에 따라 또는 너무 많이 발생하는 경우)? 비교를 위해지도 요소에 대한 O (1) 액세스가 도움이됩니다.

+0

충돌 값을 재생성하는 것이 유효한 포인트입니다. 매우 큰 목록의 경우 불필요한 이동을 피하기 위해 첫 번째 요소 대신 마지막 요소를 검색 할 수 있습니다 (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/List.html#remove % 28int % 29). 또한 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Stack.html과 같은 LIFO 스택을 사용하면이 작업에 도움이 될 수 있습니다.그러나 10 개의 무작위 수 목록을 보면 그다지 큰 차이는 없습니다. 여기에 –

+0

때마다 10 임의의 숫자가 time.bt에서 생성하고 있습니다 나는 새로운 임의의 nubers와 이전 임의의 숫자를 비교해야합니다. 어떻게해야합니까? –

+0

왜 비교해야합니까? 제거 할 때마다 생성 된 10 개의 숫자 목록에서 새로운 고유 난수를 얻습니다. 예를 들어, 셔플 된 숫자의 한 세트는 9,8,6,1,3,2,4,5,10,7 일 수 있습니다. 따라서이 목록에서 고유 번호를 가져올 때마다 – Slartibartfast

0

이 클래스의 주요 속성에서 'HashSet'클래스를 사용하면 값이 다르기 때문에 값이 반복되지 않음을 의미합니다 ...... 그래서 무작위로 생성 할 수 있습니다. 와 .... nextInt 매개 변수의 최대 없음을주고있다 그것을이

Random r = new Random(); 
int i = r.nextInt(100); 

HashSet<int> s = new HashSet<int>(); 
s.add(i); 

generat라는 임의의 숫자와 같은 세트에 추가하고 그것을 INTI HashSet에 추가하고 사용합니다. 범위는 ...

예제 코드는 다음과 같이

여기
Random r = new Random(); 
     //declare a hash set 
     HashSet set = new HashSet(); 


     for(int i=0;i<50;i++) 
     { 
      set.add(r.nextInt(100)); 
     } 


     // create an iterator 
      Iterator iterator = set.iterator(); 

      // check values 
      while (iterator.hasNext()){ 
      System.out.println("Value: "+iterator.next() + " "); 
      } 
+0

이 코드를 사용하지만 중복을 생성합니다. 제발 도와주세요 –

+0

u는 잘못된 방식으로이 코드를 사용하고 있습니다 ..... 나는 완전한 코드 복사본을 붙여 넣기하고 실행하고 아니오를 보게 할 것입니다. 세트에서 다시 반복됩니다. – Rahul

0

것은 내가 내 프로젝트에 사용 된 코드입니다. 전체 소스 코드 here

package com.banglardin.test_code; 

import android.app.*; 
import android.content.*; 
import android.content.res.*; 
import android.os.*; 
import android.view.*; 
import android.widget.*; 
import com.banglardin.test_code.*; 
import java.util.*; 

public class MainActivity extends Activity {  

protected SharedPreferences preference; 
protected Questions questionObject; 
protected TextView textView; 
protected Button buttonView, cleanButton; 
protected ArrayList<String> ques_array; 
protected final String KEY="Key124"; 
protected int i=0; 


/** Called when the activity is first created. */ 
@Override 
    public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
setContentView(R.layout.main); 

//intilized Question and preference 
questionObject = new Questions(); 
preference = getSharedPreferences(KEY,Context.MODE_WORLD_WRITEABLE); 
    // get array from question object 
try{  
ques_array= questionObject.getQestions(getApplicationContext()); 
}catch(Exception e){ 
    e.printStackTrace(); 
    } 

// intilized views 
textView = (TextView)findViewById (R.id.question); 
buttonView = (Button) findViewById (R.id.button); 
cleanButton = (Button) findViewById (R.id.button_clean); 

textView.setTextSize(18.33f); 
buttonView.setTextSize(18.00f); 
cleanButton.setTextSize(18.00f); 


// set onclickListener on button view 
    buttonView.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v) { 

    int set = 0; 
    if(i < 6){ 
    while(set == 0){ 
     String history = getString(KEY); // <0>  
     Random r = new Random(); 
     int id = r.nextInt(ques_array.size()); 
     String s_id= "<"+ String.valueOf(id) + ">"; // ex : <0> 



     if(!history.contains(s_id)){ 
      textView.setText(ques_array.get(id)); 
      setString(KEY, (history + s_id)); // ex : <0> + <3> = <0><3>; 
      set = 67; 
      i++; 
      }   
      } 
      } 



    else if(i>=6){ 
      textView.setText(getResources().getString(R.string.e2));   
      Toast.makeText(MainActivity.this,"Questions are not available any more",2).show(); 
      }   
     }   
     } 
    ); 


// set onclickListener on button view 
    cleanButton.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v) { 
      setString(KEY, "<-0>"); 

     } 
     } 
     ); 

     } 


    @Override 
    public void onBackPressed(){ 
if(preference != null){ 
    setString(KEY, ("<-0>"));  
    finish(); 
} 
super.onBackPressed(); 
} 

    /** Get String value from preference */ 
    private String getString(String KEY){ 
    if(preference != null){ 
    return preference.getString(KEY,"<-33>"); 
    } 
    else{ 
     return null; 
     } 
     } 

    /** Put String value to preference */ 
    private void setString(String KEY, String value){ 
if(preference != null){ 
    SharedPreferences.Editor edit = preference.edit(); 
    edit.putString(KEY, value); 
    edit.commit(); 
    } 
    } 


    /** Class that gives us all questions */ 
    class Questions{ 
protected ArrayList<String> data; 
public ArrayList<String> getQestions(Context c) throws Exception{ 
    data = new ArrayList<String>(); 
    Resources res= c.getResources(); 

    String qes[] ={ 
    res.getString(R.string.q1)  , //0 
    res.getString(R.string.q2)  , //1 
    res.getString(R.string.q3) , //2 
    res.getString(R.string.q4) , //3 
    res.getString(R.string.q5) , //4 
    res.getString(R.string.q6) , //5 
    res.getString(R.string.q7)  , //6 
    }; 

    // add all the strings one by one 
    for(String i : qes){ 
    data.add(i);   
    } 
    return data; 
     }   
    } 
    } 
관련 문제