안녕하세요 프로그래밍 초짜입니다.
뽑기 버튼을 누르면 중복되지않게 랜덤으로 텍스트를 3개를 뽑아 버튼에 나타내려고 하는데요,
메인은 4개의 버튼인데 랜덤을 돌리는 id random버튼이 있고
나머지 3 버튼(r1,r2,r3)에 중복되지 않는 랜덤 텍스트를 나타내려고 합니다
액티비티
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;
import java.util.Random;
public class xx extends Activity
{
private Random m_rand = new Random();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button number1 = (Button)findViewById(R.id.r1);
final Button number2 = (Button)findViewById(R.id.r2);
final Button number3 = (Button)findViewById(R.id.r3);
OnClickListener listener = new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
number1.setText(String.valueOf(m_rand.nextInt(45+1)));
number2.setText(String.valueOf(m_rand.nextInt(45+1))); ★ 이부분!
number3.setText(String.valueOf(m_rand.nextInt(45+1)));
}
};
((Button)findViewById(R.id.Random)).setOnClickListener(listener);
}
}
처음부터 시작해 보다가 로또 소스를 받아서 변형해보는 중인데
★부분에서 46개의 숫자 하나하나에 해당텍스트를 넣고 버튼에 그리는식으로 하려하지만..
랜덤 숫자에 텍스트를 넣는 것 보다 그냥 텍스트 배열에서 랜덤으로 추출하게 하는게 편할까요?
계속 실패만 거듭하고 진전이 없네요. 버튼을 누르면 alertdialog를 이용해 정보도 출력해볼까 하는데
수련의 길은 멀고 험난하네요 ㅎㅎ 좋은 생각이 있으신분은 자그마한 가르침이라도 감사하게 받겠습니다 도와주세요!
![profile](https://www.androidpub.com/files/member_extra_info/profile_image/198/421/001/1421198.png?20110408112725)
생성된 숫자는 별도의 배열에 저장한 후 다음 랜덤 숫자 생성시에 먼저 생성된 숫자와 중복되는지 비교하면서 중복된다면 취소하고 다시 생성하는 방식으로 처리하시면 중복되지 않은 숫자를 뽑으실 수 있습니다만...
위의 방식으로 일단 원하는 갯수의 숫자를 모두 뽑은 다음에 텍스트 뷰에 적용해 보세요~
redred님께서 말씀하신 것처럼 하시면 되는데요 좀더 쉽게 설명을 드리면
ArrayList 같은데 출력할 데이터를 넣으시구요
랜덤 숫자 생성해서 ArrayList 크기로 나눈 나머지(% 연산)를 구하면 ArrayList 항목의 인덱스가 랜덤하게 나오겠죠.
그 인덱스의 데이터를 사용하시고 ArrayList에서는 그 인덱스의 데이터를 삭제합니다.
그러면 ArrayList의 크기가 하나 줄어들겠죠.
이걸 원하는 개수만큼 반복하시면 됩니다.
ArrayList에 들어가는 데이터는 텍스트든, 뭐든 다 되겠죠.
pure java에 있는 TreeSet을 이용하시면 간단하게 해결이 됩니다.
TreeSet<Integer> lotto = new TreeSet<Integer>();
//size가 6이 되기 전에는 계속 루프를 도는데
//TreeSet은 중복된 값을 허용하지 않으므로
//다른 수 6개가 저장이 되면 루프를 탈출
while(lotto.size() < 6)
{
int num = (int)(Math.random()*45)+1;
lotto.add(num);
}
이런식으로 작성하면 어떤 타입이든지 가능하겠죠. 힘들게 비교 할 필요없이요.
그냥 간단하게 구현한다면.. 값을 확인해보고 중복된 값이면 다시 random 을 돌리면 되지 않을까용?
중복되지 않은 값이 나오도록 계속 반복해서 구하는거죠.
컴퓨터 연산이 아깝다고 생각되시면 좀 더 머리를 써서.. random 값 나온 것을 앞에서부터의 순서라고 생각해도 될거 같아요.
이전에 나온 거는 해당 목록에서 skip 시킨다는 가정을 하구요. 그러면 굳이 반복된 연산을 하지 않고도
항상 중복되지 않은 값을 얻어낼 것 같습니다.