使用TinyMT时,我的C代码出现问题。 我想要解释函数如何工作,并希望他们想要他们的参数。
我的linter已经抛出错误:(
public class ApiClientPost {
private static final String BASE_URL = "http://BASE.URL/api/";
private static Retrofit retrofit = null;
public static Retrofit getClient(){
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
public interface ApiInterface {
@Multipart
@Headers({
"content-type: multipart/form-data"
})
@POST("eclaims/UploadFiles")
Call<JsonElement> UploadFiles(@Part MultipartBody.Part body);
}
FileInputStream fin = null;
try {
fin = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fin);
DataInputStream dis = new DataInputStream(bis);
fileContent = toByteArray(dis);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
MediaType mediaType = MediaType.parse("video/mp4");
RequestBody requestFile =
RequestBody.create(mediaType,
file
);
MultipartBody.Part body =
MultipartBody.Part.createFormData("", file.getName(),
requestFile);
ApiInterface apiInterface =
ApiClientPost.getClient().create(ApiInterface.class);
Call<JsonElement> uploadFile = apiInterface.UploadFiles(body);
uploadFile.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(Call<JsonElement> call,
Response<JsonElement> response) {
if (response.isSuccessful()) {
JsonElement mainResponse = response.body();
Log.d("Response ===", mainResponse.toString());
} else {
Log.e("Response ===", "Failed");
}
}
@Override
public void onFailure(Call<JsonElement> call, Throwable t) {
Log.e("Failed ===", t.getMessage());
}
});
TinyMT库被用来随机生成数字,没有关于如何使用它的文档,如果有人可以给我一个如何使用这个神奇工具的指示,我很乐意!
提前谢谢
答案 0 :(得分:0)
让我们看一下source code中的评论:
/**
* This function initializes the internal state array with a 64-bit
* unsigned integer seed.
* @param random tinymt state vector.
* @param seed a 64-bit unsigned integer used as a seed.
*/
void tinymt64_init(tinymt64_t * random, uint64_t seed)
相应的header file也说:
/**
* This function outputs 64-bit unsigned integer from internal state.
* @param random tinymt internal status
* @return 64-bit unsigned integer r (0 <= r < 2^64)
*/
inline static uint64_t tinymt64_generate_uint64(tinymt64_t * random)
后者位于头文件(和inline static
)中,因为它非常简单,原作者想让C编译器清楚地知道函数可以内联(因而额外的“成本”) “应避免使用函数调用。”
没有函数来获取随机种子(无符号64位整数),因此PRNG将产生相同的随机数序列,或者我们需要以某种方式自己生成合适的种子
让我们将上述注释实现为示例程序。为简单起见,我们使用固定种子1
。
#include <stdlib.h>
#include <inttypes.h>
#include <stdio.h>
#include "tinymt64.h"
int main(void)
{
uint64_t seed = UINT64_C(1);
uint64_t value;
tinymt64_t prng;
tinymt64_init(&prng, seed);
value = tinymt64_generate_uint64(&prng);
printf("The first value using seed %" PRIu64 " is %" PRIu64 ".\n",
seed, value);
return EXIT_SUCCESS;
}
因为我使用GCC,我将上面保存为example.c
,将两个文件放在同一目录中,然后使用
gcc -Wall -O2 -c tinymt64.c
gcc -Wall -O2 -c example.c
gcc -Wall -O2 example.o tinymt64.o -o example
所以我可以使用
运行它./example
代码是标准C,应该在TinyMT64编译的所有系统上编译,包括在Windows上。
让我们看一下代码。
首先,tinymt64_init()
获取指向tinymt64_t
和uint64_t
种子的指针。第一个用作生成器的状态,第二个用作种子值(用于初始化状态)。因为状态是一个小结构(struct TINYMT64_T
,稍后在头文件中键入tinymt64_t
),并且没有灵活的数组成员,我们只能将状态声明为普通变量{{ 1}}。然后指向状态的指针为tinymt64_t prng;
。该函数不返回任何内容。
其次,&prng
只接受指向生成器状态的指针,并将伪随机数作为tinymt64_generate_uint64()
返回。
最后,uint64_t
宏在UINT64_C()
(或inttypes.h
)中定义,并允许您定义从stdint.h
到{{1}的无符号64位整数在没有猜测特定编译器可能需要的类型后缀(无,0
或可能18446744073709551615
)的情况下。 (如果常数小于2 31 = UL
,则不需要宏,但不会有任何损害。)
ULL
宏在2147483648
中定义,并定义转换模式(前导PRIu64
和可选大小字段除外)inttypes.h
系列函数需要打印正确地%
。
如果你想从中读取种子,例如命令行,你可以使用例如。
printf()
,如果指定了第一个命令行参数,则使用第一个命令行参数,否则使用默认常量种子(uint64_t
)。