سوال در مورد عدد تصادفی
من میخواهم خروجی عدد تصادفی بگیرم و عدد تصادفی خروجی با عدد تصادفی قبلیش یکی نباشه . چرا این درست کار نمیکنه الگوریتم بهتری هست؟
public int b = 1;
public int low = 1;
public int high = 10;
public int old = 0;
public int New = 0;
j.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (b == 1) {
old = (int) (Math.random() * (high - low + 1)) + low;
t.setText("" + old);
} else if (b == 2) {
New = (int) (Math.random() * (high - low + 1)) + low;
if ( !(old == New)) {
t.setText("" + New);
}
} else if (b >= 3) {
old = New;
New = (int) (Math.random() * (high - low + 1)) + low;
if ( !(old == New)) {
t.setText("" + New);
}
}
b++;
}
});
هنوز مشکل داره
public int b = 1;
public int low = 1;
public int high = 10;
public int old = 0;
public int New = 0;
j.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (b == 1) {
old = (int) (Math.random() * (high - low + 1)) + low;
t.setText("" + old);
} else if (b == 2) {
New = (int) (Math.random() * (high - low + 1)) + low;
if ( !(old == New)) {
t.setText("" + New);
} else {
New = (int) (Math.random() * (high - low + 1)) + low;
}
} else if (b >= 3) {
old = New;
New = (int) (Math.random() * (high - low + 1)) + low;
if ( !(old == New)) {
t.setText("" + New);
} else {
New = (int) (Math.random() * (high - low + 1)) + low;
}
}
b++;
}
});
تصحیح شد
public int b = 1;
public int low = 1;
public int high = 10;
public int old = 0;
public int New = 0;
j.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (b == 1) {
old = (int) (Math.random() * (high - low + 1)) + low;
t.setText("" + old);
} else if (b == 2) {
New = (int) (Math.random() * (high - low + 1)) + low;
if ( !(old == New)) {
t.setText("" + New);
} else {
New = (int) (Math.random() * (high - low + 1)) + low;
t.setText("" + New);
}
} else if (b >= 3) {
old = New;
New = (int) (Math.random() * (high - low + 1)) + low;
if ( !(old == New)) {
t.setText("" + New);
} else {
New = (int) (Math.random() * (high - low + 1)) + low;
t.setText("" + New);
}
}
b++;
}
});
سلام اگه منظورت اینه که تکراری زیاد میده : یه روش خوب برای کاهش احتمال تکرار عدد تصادفی :
اول یه آرایه دینامیک از 0 تا 9 درست کن :
ArrayList<Integer> array = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
array.add(i);
}
بعد کدهای زیر رو بنویس ( با توجه به شرطی که نیاز داری ) :
if (conditions ...) {
Collections.shuffle(array);
int old = array.get((int) (Math.random() * 10));
t.setText("" + old);
}
خط اول داخل شرط ، آرایه array که ساختیم رو زیر و رو میکنه و به طور تصادفی همه عناصر رو جایگذاری مجدد میکنه :)
خط بعد هم میاد یه عنصر به صورت تصادفی از آرایه ای که تصادفی تولید شده بر میداره . یعنی در هر بار اجرای دستور if دو بار از رندوم استفاده کردی تا مطمئن بشی که عدد تکراری بهت نمیده . ( البته باز هم ممکنه تکراری بده ولی طبیعیه ، مثل پرتاب تاس که ممکنه 10 بار پرتاب کنی و هر 10 بار 6 بیاد که طبیعیه ) . حالا اگه به قول Criss میخوای با عدد قبلی یکی نباشه میتونی قبل از اینکه جعبه متن رو setText کنی یه متغییر new هم تعریف کنی و اون دو خط رو دوباره بنویسی تا دوباره عدد تصادفی تولید بشه .
برای اینکه احتمال تکرار در تولید اعداد تصادفی به صفر برسه:
- آرایه ای n تایی از اعداد صحیح درست کن و توی حلقه for آرایه رو اصطلاحا initialize کن
- یک متغیر بساز به اسم max که و مقدارشو بذار برابر با بزرگترین ایندکس آرایه که میشه طول آرایه منهای 1
- یک عدد تصادفی بین 0 و max بساز و مقدار آرایه در خانه های 0ام و max ام رو با هم جابجا کن
- مقدار آرایه در خانه max ام میشه عدد تصادفی که میخوای پس مقدار آرایه در خونه max ام رو return کن
- برای اینکه این عدد دوباره تکرار نشود مقدار max رو یکی کم کن
- تا زمانیکه max > 0 از شماره 3 تا 5 رو تکرار کن
- هرموقع max= 0 میتونی دوباره مقدارشو به حالت اول برگردونی(البته الان آرایه ات shuffle شده )
- من تست نکردم => امیدوارم جواب بده....
- موفق باشی
public class ActivityMain extends Activity{
int[] numbers = new int[21];
int max;
@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
for (int i = 0; i < 21; i++) {///initializing array
numbers[i] = i;
}
max = numbers.length - 1;//این متغیر مقدار بزرگترین ایندکس فعلی آرایه را دارد....از 20 شروع میشه
while (max > 0) {
Log.e("LOG", "" + uniqeRandomNumbers());
if (max == 0) {
max = numbers.length - 1;////هروقت مقدار مکس 0 شد،دوباره مقدار بیشترین ایندکس آرایه رو واریز میکنیم
}
}
}
public int uniqeRandomNumbers() {
int r_index = (int) (Math.random() * max);//یک عدد تصادفی بین 0 و مکس بساز
///////////////////////////
int swap;
swap = numbers[max];
numbers[max] = numbers[r_index];
numbers[r_index] = swap;///////مقادیر ایندکس مکس و عدد تصادفی بدست اومده رو جابجا کن
return numbers[max--];//مقدار آرایه در ایندکس مکس رو برمیگردونه و یکی از مکس کم میکنه
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .