我正在做测验应用程序。在这个应用程序问题不会生成重复。所以我使用像 int value=random.nextInt(10-1)+1 这样的代码。当我提交答案时,随机数会新生成,因此会产生重复项。我如何每次都将以前的随机值与新的随机值进行比较?
问问题
2163 次
4 回答
3
- 从 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 - 生成特定数字的随机范围而不重复这些数字 - 如何?
就像另一个答案说的那样,存储在 HashMap 中并进行检查是一种聪明的方式。但这可能会导致更多的冲突,因为每次尝试向 HashMap 添加副本时都会失败,并且必须再次生成新的。但是一次全部生成并改组不会导致这种情况。但是由于输入集很小(10),这种冲突可能不会发生太多(取决于随机性,或者可能发生太多?)并且 O(1) 访问地图元素进行比较会有所帮助。
于 2013-07-18T06:34:19.320 回答
2
将值存储在哈希图中,然后检查它是否已经存在。如果有reroll。
于 2013-07-18T06:34:08.243 回答
0
这是我在项目中使用的代码。完整的源代码在 这里
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;
}
}
}
于 2013-07-18T10:55:01.747 回答
0
在此类的主要属性中使用'HashSet'类是它们包含一组不同的值意味着其中没有重复值......所以你可以生成随机数。并像这样将其添加到集合中
Random r = new Random();
int i = r.nextInt(100);
HashSet<int> s = new HashSet<int>();
s.add(i);
生成随机数并将其添加到 inti hashset 并使用它.... nextInt 参数中的一个必须给出最大编号。范围...
示例代码如下:
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() + " ");
}
于 2013-07-18T06:52:39.260 回答