آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

سوال در مورد عدد تصادفی

GOOD  10 سال پیش  10 سال پیش
0 0

من میخواهم خروجی عدد تصادفی بگیرم و عدد تصادفی خروجی با عدد تصادفی قبلیش یکی نباشه . چرا این درست کار نمیکنه الگوریتم بهتری هست؟

    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++;
            }
        });
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
GOOD  10 سال پیش
0 0

هنوز مشکل داره

      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++;
            }
        });
0 0
به جای New از یه چیز دیگه استفاده کن ببین درست میشه! (10 سال پیش)
0 0
تصحیح شد ایا الگوریتمی بهتر از این که پایین نوشتم هست؟! (10 سال پیش)
0 0
برنامه درست کار میکنه؟ (10 سال پیش)
پاسخ به سوال 
GOOD  10 سال پیش
0 0

تصحیح شد

    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 0
ایا الگوریتم بهتری هست؟! (10 سال پیش)
0 0
برنامت در مورد چی هست؟ (10 سال پیش)
0 0
درست شد ولی میخواهم بدوم الگوریتمی بهتر از این میشه نوشت؟ (10 سال پیش)
0 0
این برنامه کارش چیه؟ (10 سال پیش)
0 0
عدد تصادفی بده برای برنامه ای که میخواهم بسازم لازمه (10 سال پیش)
0 0
عدد تصادفی ایجاد شده ؟ با عدد قبلی یکی نباشه ؟ یا کلا با تمام اعداد قبلی تکرای نباشه ؟ (10 سال پیش)
پاسخ به سوال 
Reza  10 سال پیش
+1 0

سلام اگه منظورت اینه که تکراری زیاد میده : یه روش خوب برای کاهش احتمال تکرار عدد تصادفی :

اول یه آرایه دینامیک از 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 هم تعریف کنی و اون دو خط رو دوباره بنویسی تا دوباره عدد تصادفی تولید بشه .

0 0
بسیار ممنون (10 سال پیش)
پاسخ به سوال 
مسعود فرمانی  10 سال پیش
+1 0

برای اینکه احتمال تکرار در تولید اعداد تصادفی به صفر برسه:

  1. آرایه ای n تایی از اعداد صحیح درست کن و توی حلقه for آرایه رو اصطلاحا initialize کن
  2. یک متغیر بساز  به اسم max که و مقدارشو بذار برابر با بزرگترین ایندکس آرایه که میشه طول آرایه منهای 1
  3. یک عدد تصادفی بین 0 و max بساز و مقدار آرایه در خانه های 0ام و max ام رو با هم جابجا کن
  4. مقدار آرایه در خانه max ام میشه عدد تصادفی که میخوای پس مقدار آرایه در خونه max ام رو return کن
  5. برای اینکه این عدد دوباره تکرار نشود مقدار max رو یکی کم کن
  6. تا زمانیکه max > 0 از شماره 3 تا 5 رو تکرار کن
  7. هرموقع max= 0 میتونی دوباره مقدارشو به حالت اول برگردونی(البته الان آرایه ات shuffle شده )
  8. من تست نکردم => امیدوارم جواب بده....
  9. موفق باشی

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--];//مقدار آرایه در ایندکس مکس رو برمیگردونه و یکی از مکس کم میکنه

}
}

 


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .