我创建了一个应用程序,应该从一组图像中随机选择一张图片。在我的模拟器 Nexus 5X Android 5.1 上,一切正常。但是,在我的真实设备 Galaxy Note 10 Lite 上尝试相同操作时,我总是以相同顺序获取相同的“随机”数字。我需要先重新启动手机才能生成新的“随机”数字列表,然后这些数字一直都是相同的。例如,我的数组包含200个元素,我在Galaxy上打开应用程序,它为图像ID选择以下随机数字:43、12、176、33、2、78。然后我关闭应用程序并再次打开应用程序,现在它又有完全相同的“随机”数字:43、12、176、33、2、78。我需要重新启动手机才能获得新的随机数字,这些数字会一直保持不变,直到我再次重启手机。在模拟器上一切正常,每次重新启动应用程序时,我都能如预期地获得新的随机数。
以下是我的应用程序的完整代码,不包括图像列表:
MainActivity.kt
以下是我的应用程序的完整代码,不包括图像列表:
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val imageList = arrayOf(Image(R.drawable.image1, false),
Image(R.drawable.image2, false),
Image(R.drawable.image3, false))
val imageViewMain = findViewById<ImageView>(R.id.imageViewMain)
loadNextImage(imageViewMain, imageList)
imageViewMain.setOnClickListener {
val dialogClickListener =
DialogInterface.OnClickListener { _, which ->
when (which) {
DialogInterface.BUTTON_POSITIVE -> {
loadNextImage(imageViewMain, imageList)
}
DialogInterface.BUTTON_NEGATIVE -> { }
}
}
val builder: AlertDialog.Builder = AlertDialog.Builder(this)
builder.setMessage("Nächstes Bild?").setPositiveButton("Ja", dialogClickListener)
.setNegativeButton("Nein", dialogClickListener).show()
}
}
private fun getNextChoice(): Int {
return (0..1).random()
}
private fun getNextImage(imageList: Array<Image>): Int {
val listSize = imageList.size
var imageId: Int
do {
imageId = (0 until listSize).random()
} while (imageList[imageId].played)
imageList[imageId].played = true
return imageList[imageId].image
}
private fun loadNextImage(imageViewMain: ImageView, imageList: Array<Image>) {
val imageQuestionmark = R.drawable.questionmark
val nextChoice = getNextChoice()
if (nextChoice == 0) {
imageViewMain.load(imageQuestionmark)
} else if (nextChoice == 1) {
imageViewMain.load(getNextImage(imageList))
}
Toast.makeText(this, "Bild hat geladen", Toast.LENGTH_SHORT).show()
}
}
图片:
data class Image(
val image: Int,
var played: Boolean
)
编辑: 我尝试了cactustictacs在评论中提出的建议,并创建了一个简单的应用程序,一次使用kotlin随机函数,一次使用java随机函数。以下是我使用的代码:
Kotlin:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val buttonTest = findViewById<Button>(R.id.buttonTest)
buttonTest.setOnClickListener {
val getRandomNumber = (0..999).random()
Toast.makeText(this, getRandomNumber.toString(), Toast.LENGTH_SHORT).show()
}
}
}
Java:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonTest = (Button) findViewById(R.id.buttonTest);
buttonTest.setOnClickListener(v -> {
int randomNumber = new Random().nextInt(999);
Toast.makeText(this, "" + randomNumber, Toast.LENGTH_SHORT).show();
});
}
}
在 Kotlin 上,我遇到了与我的初始问题相同的行为,无论我对应用程序做什么(即使是卸载和重新安装),我始终得到相同的数字集合。在 Java 上,它按预期工作,一旦我关闭应用程序,就会得到一个新的数字集合。因此,错误明确地出现在 Kotlin 中。
也许这有所帮助,我的 Android 版本是12,我的手机是 Galaxy Note 10 Lite。
(0..999).random()
或Random.nextInt(999)
并显示它的按钮,那么您会得到相同的行为吗?它应该使用设备的默认随机源,所以我首先要检查的是您的设备是否实际上正在这样做。也许可以检查一下Java类(例如https://docs.oracle.com/javase/8/docs/api/java/util/Random.html)是否有任何不同的行为。 - cactustictacsRandom.nextInt(999)
在 Kotlin 中能够正常工作吗?还是一样的?Random.Default
呢?您可以在集合、范围等中使用Random
来生成随机数,还有一个toKotlinRandom()
扩展可以用于java.util.Random()
(您可以从 Kotlin 调用该扩展),但您不需要提供它。如果您始终在默认的随机生成器中看到此行为,则可能值得在 Kotlin 网站上报告此问题。他们会更了解您在此情况下应该做什么。 - cactustictacs